在这个关于函数式编程的视频中,在35:14,Jim Weirich编写了一个无需使用递归,库函数或循环即可计算阶乘的函数:在此处查看Ruby代码的图像
Ruby中的代码
fx = ->(improver) {
improver.(improver)
}.(
->(improver) {
->(n) { n.zero ? 1 : n * improver.(improver).(n-1) }
}
)
我正在尝试表达这种方法F#
let fx =
(fun improver -> improver(improver))(
fun improver ->
fun n ->
if n = 0 then 1
else n * improver(improver(n - 1)))
我目前停留在
类型不匹配。期望一个'a但给定一个'a->'b
当统一'a'和'a->'b'时,结果类型将是无限的
我似乎找不到正确的类型注释或其他表达功能的方式
编辑:
*没有rec关键字
具有ML样式类型推断的语言将无法为该术语推断类型fun improver -> improver improver
;他们首先假设'a -> 'b
一个lambda定义的类型(对于某些不确定的类型'a
和'b
),所以当参数improver
具有type时'a
,然后将其应用于自身以给出结果(type 'b
),因此improver
必须同时具有type 'a -> 'b
。但是在F#类型系统中,无法统一这些类型(在简单类型的lambda演算中,根本没有办法为该术语提供类型)。我对您在评论中链接到的问题的回答包括一些解决方法。@desco已经给出了其中之一。另一个是:
let fx = (fun (improver:obj->_) -> improver improver)
(fun improver n ->
if n = 0 then 1
else n * (improver :?> _) improver (n-1))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句