我正在通过UPENN Haskell lecture notes学习Haskell类型类,使用示例代码创建自己的类型类:
class Listable a where
toList :: a -> [Int]
instance Listable Int where
toList x = [x]
instance Listable Bool where
toList True = [1]
toList False = [0]
它适用于 Int
和 Bool
但 ghci
在我添加 [Int]
的实例时失败:
instance Listable [Int] where
toList = id
错误:
'Listable [Int]'的非法实例声明(所有实例类型必须是(T a1 ... an)形式,其中a1 ... an是不同的类型变量,每个类型变量在实例中最多出现一次如果你想禁用它,请使用FlexibleInstances . )在'Listable [Int]'的实例声明中
我试了好几次但都失败了:
toList x = id x
toList x = x
toList = \x -> x
我该怎么办呢?
1 回答
只需在源文件的顶部添加以下行
这将启用此表单的实例声明所需的
FlexibleInstances
扩展,因为Haskell 98不允许它们 .请注意,您也可以通过在调用
ghc
或ghci
时添加-XFlexibleInstances
标志来启用扩展,但这样做被认为是一种不好的做法,因为它将为所有模块启用扩展 . 这也意味着您的程序只能成功编译,具体取决于传递给编译器的命令行标志 . 这就是为什么最好在每个模块的基础上启用扩展,如上所述 .