声明一个类型类的列表实例

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

它适用于IntBool ,但当添加[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不允许它们。

请注意,您也可以通过在调用ghcghci时添加-XFlexibleInstances标志来启用扩展,但这样做被认为是不好的做法,因为它会为所有模块启用扩展。 这也意味着你的程序只能根据传递给编译器的命令行标志成功编译。 这就是为什么最好在每个模块上启用扩展,正如我上面所解释的。

链接地址: http://www.djcxy.com/p/43527.html

上一篇: Declare list instance of a type class

下一篇: error Couldn't match expected type ‘Char’ with actual type ‘[Char]’