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,这样minimum 2 inf的计算结果是2,但是我的代码似乎不工作,它永远不会停止,“延迟”版本的minimum没有任何不同,那么如何编写一个真正的延迟版本的minimum呢?
发布于 2017-10-11 10:09:13
惰性Nat与同感Nat不同。Nat有两个构造函数,Z和S。S需要转换为惰性Nat。
您可以编写一个协同归纳的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 infhttps://stackoverflow.com/questions/46658084
复制相似问题