我定义了这样的类型:
data MyList a = Empty | Cons a (MyList a)
在Haskell中,空MyList
可以用Empty
实例化,但Idris抱怨:
> Empty
(input):Can't infer argument a to Empty
为什么?
答案 0 :(得分:3)
:set showimplicits
有助于调试错误消息:
>:set showimplicits
>:t Empty
Main.Empty : {a : Type} -> Main.MyList a
正如您所看到的,类型构造函数有一个参数,它无法推断它。如果你调用一个函数(比如Empty
就是一个),Idris会尝试推断所有隐式参数的值。如果可以从上下文中推断a
,例如使用the (MyList Nat) Empty
,则可以正常工作。
如果你明确这个论点,它也有效(你可以看到Haskell和Idris之间的区别):
data MyList : Type -> Type where
Empty : (a : Type) -> MyList a
Cons : (a : Type) -> (x : a) -> MyList a -> MyList a
>Empty
Empty : (a : Type) -> MyList a
伊德里斯' a
是显式的,而在Haskell中隐藏了未绑定的类型参数:Empty :: MyList a
。