声明一个类型类的列表实例
我通过UPENN Haskell讲义学习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
,但当添加[Int]
的实例时, ghci
失败:
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
我怎么修复它?
只需在源文件的顶部添加以下行即可
{-# LANGUAGE FlexibleInstances #-}
这将启用该表单的实例声明所需的FlexibleInstances
扩展,因为Haskell 98不允许它们。
请注意,您也可以通过在调用ghc
或ghci
时添加-XFlexibleInstances
标志来启用扩展,但这样做被认为是不好的做法,因为它会为所有模块启用扩展。 这也意味着你的程序只能根据传递给编译器的命令行标志成功编译。 这就是为什么最好在每个模块上启用扩展,正如我上面所解释的。
上一篇: Declare list instance of a type class
下一篇: error Couldn't match expected type ‘Char’ with actual type ‘[Char]’