没有参数的类型构造函数导致 "Can't infer argument" 错误

Type constructor with no parameters causing "Can't infer argument" error

我定义了这样一个类型:

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

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

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

这是为什么?

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

Idris 的 a 是显式的,而在 Haskell 中未绑定类型参数是隐藏的:Empty :: MyList a.