这是一个非常简单的问题,我只是想检查一下我在做什么以及我如何解释 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/