在GHCi中,let y = y + 1
编译得很好,但是当我尝试计算y时,得到的结果是*** Exception: <<loop>>
为什么没有编译错误?<<loop>>
是什么意思?
发布于 2015-01-09 04:11:47
我想添加一个最小的例子来说明这在哪里可能是有用的。
data Peano = Z | S Peano
instance Num Peano where
p + Z = p
p + (S q) = S (p + q)
fromInteger 1 = S Z
instance Eq Peano where
Z == Z = True
Z == _ = False
_ == Z = False
(S p) == (S q) = p == q
instance Ord Peano where
Z `compare` Z = EQ
Z `compare` _ = LT
_ `compare` Z = GT
(S p) `compare` (S q) = p `compare` q
y :: Peano
y = y + 1
main :: IO ()
main = print $ 1 < y
在这种情况下,y
是无穷大的,直到同构。(不过,我的fromInteger
显然是一个糟糕的实现,因此在不修复fromInteger
的情况下将文字1
更改为其他值将失败。)
注意,这只是因为我定义的(+)
在它的第一个参数中是惰性的,并且我定义的compare
也足够惰性。
https://stackoverflow.com/questions/27557380
复制相似问题