在F#中,必须使用rec
关键字。在Haskell中,无需显式判断给定函数是否是递归的。
考虑到递归在函数式编程中的作用,F#设计对我来说似乎很奇怪。这是一个好的语言设计决策,还是仅出于历史原因或由于实施限制而存在?
在F#中,必须使用rec
关键字。在Haskell中,无需显式判断给定函数是否是递归的。
考虑到递归在函数式编程中的作用,F#设计对我来说似乎很奇怪。这是一个好的语言设计决策,还是仅出于历史原因或由于实施限制而存在?
Answers:
Haskell和F#语义存在固有的差异。在Haskell中,函数调用不执行任何实际计算,而是分配一个称为“ thunk”的堆对象。一个怪人与自己或另一个怪人建立链接是完全可以的。但是,在F#中,函数调用是实际调用,使诸如let x = 1 : 2 : x in x
无效之类的表达式成为必需,因为它需要x
在构造之前1 : 2 : x
构造。但是,它对于无限列表仍然或多或少是合理的,应该有一些定义它的方法。这是扎根的根源rec
。如果您想要更多,请搜索并阅读SML和Haskell的操作语义-这是不同的。
这个问题已经在SO上得到了回答,它包括了为什么使用“ rec”的强大历史背景。
这是后代的重要报价:
默认情况下,法语CAML语言家族(包括OCaml)中的函数不是递归的。通过这种选择,可以轻松地在这些语言中使用let取代函数(和变量)定义,因为您可以在新定义体内引用以前的定义。F#从OCaml继承了此语法。