将C#代码转换为F#(如果声明)

问题描述:

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

I'd like to know how to convert this code line by line from C# to F#. I am not looking to use any kind of F#'s idioms or something of the like. I am trying to understand how to map directly C#'s constructs to 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)行有关:

Now, this ain't working. The problem seems to be related with the minVal = col.Item(i) line:

This expression was expected to have type     unit     but here has type     bool

什么是

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

If you want to convert it line by line then try the following

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

现在为什么您会收到该特定错误。看看下面的行

Now as to why you're getting that particular error. Take a look at the following line

minVal = col.Item(i)

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

In F# this is not an assignment but a comparison. So this is an expression which produces a bool value but inside the for loop all expressions must be void/unit returning. Hence you receive an error.

在F#中,赋值我至少知道两种形式。

Assignment in F# has at least 2 forms that I am aware of.

// Assigning to a mutable value
let mutable v1 = 42
v1 <- 13

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

当然,您应该绝对阅读Brian的文章。它非常详细,介绍了两种语言之间的翻译中的许多要点。

And of course, you should absolutely read Brian's article on this subject. It's very detailed and goes over many of the finer points on translating between the two languages

  • http://lorgonblog.spaces.live.com/Blog/cns!701679AD17B6D310!725.entry