F# 函数与值

标签 f#

这是一个非常简单的问题,我只是想检查一下我在做什么以及我如何解释 F# 是否有意义。如果我有声明

let printRandom = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

而不是创建 printRandom作为一个函数,F# 运行一次,然后为其赋值。所以,现在,当我调用 printRandom 时,不是获取一个新的随机值并打印它,而是简单地获取第一次返回的任何内容。我可以这样定义它来解决这个问题:
let printRandom() = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

这是区分无参数函数和值的正确方法吗?这对我来说似乎不太理想。它对 curry 、作曲等有影响吗?

最佳答案

正确看待这个问题的方法是 F# 没有无参数函数之类的东西。所有函数都必须带一个参数,但有时你并不关心它是什么,所以你使用 () (单位类型的单例值)。你也可以做一个这样的函数:

let printRandom unused = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

或这个:
let printRandom _ = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

但是()是表示您不使用参数的默认方式。它向调用者表达了这个事实,因为类型是 unit -> int不是 'a -> int ;以及读者,因为调用站点是printRandom ()不是 printRandom "unused" .

柯里化(Currying)和组合实际上确实依赖于所有函数都采用一个参数并返回一个值这一事实。

顺便说一句,使用单元编写调用的最常见方法是使用空格,尤其是在 F# 的非 .NET 亲属中,如 Caml、SML 和 Haskell。那是因为 ()是一个单例值,而不是像 C# 中的语法。

关于F# 函数与值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3554750/

相关文章:

c# - 从 Windows 应用商店/Metro C# 应用引用 F# 库

f# - 如何使用 Azure Devops Pipelines 构建 F# 项目?我收到错误 'The target "构建“项目中不存在”

algorithm - 是否存在进行波前迭代器的有效方法? (与物理无关。)

arrays - F# 合并排序 - 尝试实现与结构的匹配时出现 IndexOutOfRangeException

f# - Elmish.WPF类型冲突: unit -> Model expected where Model provided?

sorting - 为什么是 F#'s Seq.sortBy much slower than LINQ' s IEnumerable<T>.OrderBy 扩展方法?

F# 查找唯一元组数组的进一步要求

f# - 为什么 F# printfn 没有根据 Console.WriteLine 实现?

dictionary - 为什么 IDictionary<_, > 键与派生类型不兼容?

c# - 在 F# 中是否有 C# 的 nameof(..) 等价物?