我正在通过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
我该如何解决?
答案 0 :(得分:3)
只需在源文件顶部添加以下行
即可{-# LANGUAGE FlexibleInstances #-}
这将启用此表单实例声明所需的FlexibleInstances
扩展名,因为Haskell 98不允许这样做。
请注意,您也可以在调用-XFlexibleInstances
或ghc
时添加ghci
标记来启用扩展程序,但这样做是不好的做法,因为它会启用所有模块的扩展。这也意味着您的程序只能成功编译,具体取决于传递给编译器的命令行标志。这就是为什么最好在每个模块的基础上启用扩展,如上所述。