我想知道如何将这一行代码从C#转换为F#。我不想使用任何F#的惯用法或类似用法。我试图了解如何 C#的结构直接映射到F#。

这是C#代码:

//requires l.Length > 0
int GetMinimumValue(List<int> l) {
    int minVal = l[0];

    for (int i = 0; i < l.Length; ++i) {
        if (l[i] > minValue) {
            minVal = l[i];
        }
    }

    return minVal;
}

这是我的F#尝试:
let getMinValue (l : int list) =
    let minVal = l.Head

    for i = 0 to (l.Length-1) do
        if (l.Item(i) > minVal) then
            minVal = col.Item(i)

    minVal

现在,这是行不通的。该问题似乎与minVal = col.Item(i)行有关:
This expression was expected to have type     unit     but here has type     bool

到底是什么问题?

最佳答案

如果要逐行转换,请尝试以下操作

let getMinValue (l:System.Collections.Generic.List<int>) =
  let mutable min = l.Item(0)
  for i = 0 to (l.Count-1) do
    if l.Item(i) < min then min <- l.Item(i)
  min

现在,为什么会出现该特定错误。看一下下面这行
minVal = col.Item(i)

在F#中,这不是赋值,而是一种比较。因此,这是一个产生 bool 值的表达式,但是在for循环内,所有表达式都必须返回void/unit。因此,您会收到一个错误。

我知道F#中的赋值至少有两种形式。
// Assigning to a mutable value
let mutable v1 = 42
v1 <- 13

// Assigning to a ref cell
let v1 = ref 0
v1 := 42

当然,您应该绝对阅读Brian对此主题的文章。它非常详细,介绍了在两种语言之间进行翻译的许多细微问题。
  • http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!725.entry
  • 10-06 07:11
    查看更多