F#创建阶乘函数,无需递归,库函数或循环

克里斯多夫

在这个关于函数式编程的视频中,在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关键字

v

具有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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章