Haskell允许:
a:: Int
a = 3
data MyList a = Nil | Cons a (MyList a)
而伊德里斯会抱怨a is bound as an implicit
,
我需要使用不同类型的参数:
a: Int
a = 3
data MyList b = Nil | Cons b (MyList b)
答案 0 :(得分:6)
实际上,Idris并没有将它们混为一谈,因为n : Nat
n = 3
doNothing : Vect n Int -> Vect n Int
doNothing xs = xs
是小写的。但它可以 - 除了Haskell - 因为它支持类型中的值。所以编译器警告你,因为这是错误的常见来源。假设你写:
doNothing
您可能希望Vect 3 Int -> Vect 3 Int
的类型为doNothing
。但是,lower case arguments are bound to be implicit和{n : Nat} -> Vect n Int -> Vect n Int
的类型实际上是n
,尽管之前声明了Vect Main.n Int
。您必须编写N
或使a
大写才能使用它。
因此,编译器认为您可能希望在MyList a
中执行与true
类似的操作并发出警告。