假设我们有一个无限的列表:
data InfList : Type -> Type where
(::) : (value : elem) -> Inf (InfList elem) -> InfList elem
我们想要有限数量的元素:
getPrefix : (count : Nat) -> InfList a -> List a
getPrefix Z _ = []
getPrefix (S k) (value :: xs) = value :: getPrefix k (?rest)
那么,还剩下什么:
a : Type
k : Nat
value : a
xs : InfList a
--------------------------------------
rest : InfList a
事实证明,在模式匹配后xs
变为InfList a
而不是Inf (InfList a)
。
有没有办法让xs
延迟?
答案 0 :(得分:0)
无论如何它似乎都被推迟了。
如果您使用
执行:x getPrefix 10 one
one : InfList Int
one = 1 :: one
你得到1 :: getPrefix 9 (1 :: Delay one)
我无法在文档中找到它,但idris似乎会自动插入Delay
。
答案 1 :(得分:0)
尝试手动添加Delay
构造函数。它被隐含地删除了。
getPrefix : (count : Nat) -> InfList a -> List a
getPrefix Z _ = []
getPrefix (S k) (value :: Delay xs) = value :: getPrefix k xs