首页 文章

声明类型类的列表实例

提问于
浏览
2

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

  • 2

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

    {-# LANGUAGE FlexibleInstances #-}
    

    这将启用此表单的实例声明所需的 FlexibleInstances 扩展,因为Haskell 98不允许它们 .

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

相关问题