Haskell相当于-rectypes

时间:2014-02-27 11:22:58

标签: haskell

允许递归类型的OCaml -rectypes的GHC等价物是多少?我没有在文档中看到一个。它是隐藏的功能吗?

2 个答案:

答案 0 :(得分:8)

不幸的是,没有一个递归必须通过数据类型。但是,如果你愿意忍受一些头痛,你仍然可以很容易地编写递归类型。

 newtype RecArr b a = RecArr {unArr :: RecArr b a -> b}

 unfold = unArr
 fold   = RecArr

现在我们可以foldunfold我们的RecArr展开我们对心灵内容的递归。这有点痛苦,因为它是手动的,但完全可行。作为演示,这里是使用foldunfold编写的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

答案 1 :(得分:1)

没有。所有递归都必须通过名义类型。也就是说,您必须定义数据类型。