c# - 将 C# 代码转换为 F#(if 语句)

标签 c# .net f# c#-to-f#

我想知道如何将此代码逐行从 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# 中的赋值至少有 2 种形式。

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

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

当然,您绝对应该阅读 Brian 关于此主题的文章。它非常详细,涵盖了两种语言之间翻译的许多细节

关于c# - 将 C# 代码转换为 F#(if 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120478/

相关文章:

powershell - 是否可以使用 F# 创建 Windows PowerShell Cmdlet?

reflection - 如何在 F# 中获取模块的类型

C# foreach 内存缓存和字符串内存优化

c# - .NET 中属性的性能开销

c# - Visual Studio 设计器不显示嵌入式字体

asp.net - 无法在 IIS 上加载文件或程序集“System.Net.Http,版本=4.2.0.0,文化=中性”

c# - 存储库应该通过构造函数注入(inject)还是包装在使用中?

debugging - Visual Studio vNext 是否支持从 F# 项目到用其他语言编写的项目的 "go to definition"

c# - 在 C# 中将数字转换为单词

C# 自动将 ToLower 应用于方法字符串参数?