inf : Nat
inf = S inf
minimum' : Lazy Nat -> Lazy Nat -> Lazy Nat
minimum' Z b = Z
minimum' b Z = Z
minimum' (S a) (S b) = S (minimum' a b)
main : IO ()
main = do
print $ Force $ minimum' 2 inf
我想编写一个最小的懒惰版本,以便minimum 2 inf
评估为2
,但我的代码似乎不起作用,它永远不会停止,最小的“懒惰”版本不会t使任何不同,所以如何写一个真正懒惰的最小版本?
答案 0 :(得分:4)
一个懒惰的Nat与一个共同的Nat不同。 Nat有2个构造函数,Z和S.S需要被转换成一个懒惰的Nat。
你可以写一个像这样的coinductive的Nat:
codata CoNat : Type where
Z : CoNat
S : CoNat -> CoNat
哪个应该与:
相同data CoNat : Type where
Z : CoNat
S : Inf CoNat -> CoNat
使用codata时,请务必使用“total”关键字或使用“%default total”。这使得Idris在正确的位置告诉您错误消息。
如果您同时拥有CoNat和Nat,则可以使用几个不同的签名来编写minimum'
。也许你想要CoNat -> CoNat -> CoNat
。我选择了一个非常简单的:
total
inf : CoNat
inf = S inf
total
minimum' : Nat -> CoNat -> Nat
minimum' Z b = Z
minimum' b Z = Z
minimum' (S a) (S b) = S (minimum' a b)
total
main : IO ()
main = do
print $ minimum' 2 inf