声明类型类的列表实例

时间:2016-09-02 12:17:27

标签: haskell types typeclass

我正在通过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]

它适用于IntBoolghci在添加[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 个答案:

答案 0 :(得分:3)

只需在源文件顶部添加以下行

即可
{-# LANGUAGE FlexibleInstances #-}

这将启用此表单实例声明所需的FlexibleInstances扩展名,因为Haskell 98不允许这样做。

请注意,您也可以在调用-XFlexibleInstancesghc时添加ghci标记来启用扩展程序,但这样做是不好的做法,因为它会启用所有模块的扩展。这也意味着您的程序只能成功编译,具体取决于传递给编译器的命令行标志。这就是为什么最好在每个模块的基础上启用扩展,如上所述。