用于允许递归类型的OCaml -rectypes的GHC等效项是什么?我在文档中没有看到一个。这是隐藏的功能吗?

最佳答案

不幸的是,所有递归都必须通过一种数据类型。但是,如果您愿意忍受一点麻烦,您仍然可以很轻松地编写递归类型。

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

 unfold = unArr
 fold   = RecArr

现在,我们可以对fold进行unfoldRecArr的处理,以将递归扩展到我们的内心内容。这有点麻烦,因为它是手动的,但完全可行。作为演示,这是使用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

关于haskell - Haskell等效于-rectypes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22066986/

10-12 01:14