最近我一直在试验一般问题,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?
假设您可以使用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.
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |