没有参数的类型构造函数导致 "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
.
我定义了这样一个类型:
data MyList a = Empty | Cons a (MyList a)
在Haskell中,一个空的MyList
可以用Empty
实例化,但是Idris抱怨:
> Empty
(input):Can't infer argument a to Empty
这是为什么?
: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
.