用于允许递归类型的OCaml -rectypes的GHC等效项是什么?我在文档中没有看到一个。这是隐藏的功能吗?
最佳答案
不幸的是,所有递归都必须通过一种数据类型。但是,如果您愿意忍受一点麻烦,您仍然可以很轻松地编写递归类型。
newtype RecArr b a = RecArr {unArr :: RecArr b a -> b}
unfold = unArr
fold = RecArr
现在,我们可以对
fold
进行unfold
和RecArr
的处理,以将递归扩展到我们的内心内容。这有点麻烦,因为它是手动的,但完全可行。作为演示,这是使用fold
和unfold
编写的y组合器。 y f = (\x -> f (unfold x x)) $ fold (\x -> f (unfold x x))
factorial f n = if n == 0 then 1 else n * f (n-1)
main = print (y factorial 5) -- prints 120
关于haskell - Haskell等效于-rectypes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22066986/