键入构造函数,没有参数导致“无法推断参数”错误

时间:2018-04-17 13:57:27

标签: idris

我定义了这样的类型:

data MyList a = Empty | Cons a (MyList a)

在Haskell中,空MyList可以用Empty实例化,但Idris抱怨:

> Empty
(input):Can't infer argument a to Empty

为什么?

1 个答案:

答案 0 :(得分:3)

REPL中的

: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