模式匹配后会自动强制显示Inf值

时间:2017-06-30 12:04:03

标签: idris

假设我们有一个无限的列表:

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延迟?

2 个答案:

答案 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