在回答我的问题之前,让我说明我的理解(也许是不正确的)列表[]
是一种更高级的类型:
ghci> :kind []
[] :: * -> *
我可能会弄错,但[]
需要一个类型,因为它是List of some type 'T'
。
现在回答我的问题。
class Foo a where
bar :: String -> a
然后,我尝试创建Foo [String]
。我的理解是a
中的Foo a
是[String]
。因此,我希望bar
返回[String]
。
instance Foo [String] where
bar [] = []
bar (x:_) = [x]
但是,我得到以下编译时错误:
ghci> :l TypeClassExample.hs
[1 of 1] Compiling Main ( TypeClassExample.hs, interpreted )
TypeClassExample.hs:5:10:
Illegal instance declaration for `Foo [String]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Foo [String]'
Failed, modules loaded: none.
我犹豫是否在不理解它的情况下添加此编译时标志。
这个简单的代码有什么意义?
答案 0 :(得分:3)
Haskell语言定义非常严格,只允许列表实例具有
形式instance ... => Foo [a] where
在头部a
中的位置恰好是类型变量a
,不允许[Int]
或[String]
。
但是,您可以要求GHC忽略此限制。只需在文件的开头添加以下内容:
{-# LANGUAGE FlexibleInstances #-}
许多现代Haskell程序都在使用它。可以说,在下一个Haskell定义修订版中,应该集成这个GHC功能。