无限递归类型有用吗?

mjg*_*py3 5 haskell ghc

最近我一直在试验一般问题,GHC允许我做什么?我很惊讶地发现,它认为以下程序是有效的

module BrokenRecursiveType where

data FooType = Foo FooType

main = print "it compiles!"
Run Code Online (Sandbox Code Playgroud)

起初我想,这有什么用?然后我记得Haskell很懒,所以我也许可以定义一个类似下面的函数来使用它

allTheFoos = Foo allTheFoos
Run Code Online (Sandbox Code Playgroud)

然后我想,所以这有用吗?

对于类似形式的类型,是否有任何有价值的用例(想出或实际经历过)FooType

Joa*_*ner 9

评估柜台

假设您可以使用FooType可选地早期中止递归函数:例如,取以下代码:

foo _ 0 = 1
foo (Foo x) n = n * foo x (n-1)
Run Code Online (Sandbox Code Playgroud)

如果你打电话foo allTheFoos,那么你将得到普通的阶乘函数.但是你可以传递不同的类型值FooType,例如

atMostFiveSteps = Foo (Foo (Foo (Foo (Foo (error "out of steps")))))
Run Code Online (Sandbox Code Playgroud)

然后foo atMostFiveSteps只适用于小于6的值.

我不是说这是特别有用的,也不是说这是实现这样一个功能的最佳方式......

无效类型

顺便说一下,有一个类似的结构,即

newtype FooType' = Foo' FooType'
Run Code Online (Sandbox Code Playgroud)

这很有用:这是定义除⊥之外没有值的void类型的一种方法.你仍然可以定义

allTheFoos' = Foo' allTheFoos'
Run Code Online (Sandbox Code Playgroud)

和以前一样,但是因为在操作上,Foo什么都不做,这相当于x = xand.