为什么 Idris 不接受我的自定义弃牌?
Why won't Idris accept my custom fold?
这是一个向量,其元素由向量的长度索引。
data IxVect : (n : Nat) -> (a : Nat -> Type) -> Type where
Nil : IxVect 0 a
(::) : a n -> IxVect n a -> IxVect (S n) a
我想折一个IxVect
。
total
foldr : {b : Nat -> Type} -> ({m : Nat} -> a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (x :: xs) = f x (foldr f z xs)
我在步骤案例中得到以下错误:
test.idr:9:25:
When elaborating right hand side of Main.foldr:
Can't convert
(Nat -> Type) -> Type
with
Type -> Type
我对错误试图告诉我的内容感到困惑。我对 foldr
的定义在我看来并没有错,它在 Haskell:
中工作得很好
data Nat = Z | S Nat
data IxVect n a where
Nil :: IxVect Z a
Cons :: a n -> IxVect n a -> IxVect (S n) a
foldr :: (forall m. a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (Cons x xs) = f x (foldr f z xs)
为什么我的 foldr
无法在 Idris 中进行类型检查?
Idris 混淆了您的 foldr
和现有的。您可以通过限定递归 foldr
出现或重命名 foldr
.
来解决此问题
foldr :
{n : Nat} -> {a, b : Nat -> Type}
-> ({m : Nat} -> a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (x :: xs) = f x (Main.foldr f z xs)
这是一个向量,其元素由向量的长度索引。
data IxVect : (n : Nat) -> (a : Nat -> Type) -> Type where
Nil : IxVect 0 a
(::) : a n -> IxVect n a -> IxVect (S n) a
我想折一个IxVect
。
total
foldr : {b : Nat -> Type} -> ({m : Nat} -> a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (x :: xs) = f x (foldr f z xs)
我在步骤案例中得到以下错误:
test.idr:9:25:
When elaborating right hand side of Main.foldr:
Can't convert
(Nat -> Type) -> Type
with
Type -> Type
我对错误试图告诉我的内容感到困惑。我对 foldr
的定义在我看来并没有错,它在 Haskell:
data Nat = Z | S Nat
data IxVect n a where
Nil :: IxVect Z a
Cons :: a n -> IxVect n a -> IxVect (S n) a
foldr :: (forall m. a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (Cons x xs) = f x (foldr f z xs)
为什么我的 foldr
无法在 Idris 中进行类型检查?
Idris 混淆了您的 foldr
和现有的。您可以通过限定递归 foldr
出现或重命名 foldr
.
foldr :
{n : Nat} -> {a, b : Nat -> Type}
-> ({m : Nat} -> a m -> b m -> b (S m)) -> b Z -> IxVect n a -> b n
foldr f z Nil = z
foldr f z (x :: xs) = f x (Main.foldr f z xs)