在我看来,类型参数a
可以是任何东西,包括一个列表。为什么不能这样工作?为什么不能有一个类型参数是什么?
fun :: a -> a
fun [] = []
Haskell不想编译此代码。我想知道为什么。
Couldn't match expected type `a' with actual type `[t0]'
`a' is a rigid type variable bound by
the type signature for fun :: a -> a
我可以使它工作改写签名这样
fun :: [a] -> [a]
但是这不是我期待的,因为我想保持功能多态的东西。 我想知道id
如何在空列表上工作。
Prelude> :t id
id :: a -> a
Prelude> id []
[]
只接受参数的函数'[]'*不能*是多态!一个允许你的例子进行类型检查的类型系统将是不安全和毫无意义的 - 考虑'好玩3'。 – Fixnum
当'a'是一个列表时,我希望能得到一个'规范'。原来我不允许这样做。 –
我不明白。你的意思是* specialization *吗?如果是这样,你可以编写一个不使用任何参数细节的函数(比如'fun x = x'),或者采用一个额外的参数(可能隐含地通过类型类)来描述如何操作该类型的参数 - 例如'fun ::(a - > a) - > a - > a;有趣的fa = fa' - 一个专门的'$',以及这里唯一的可能性 - 然后你可以调用'[a]'类型的值,比如'fun(\ x-> x ++ x )[3,4,5]'。 – Fixnum