为List创建TypeClass实例

时间:2014-10-09 13:05:28

标签: haskell typeclass

在回答我的问题之前,让我说明我的理解(也许是不正确的)列表[]是一种更高级的类型:

ghci> :kind []
[] :: * -> *

我可能会弄错,但[]需要一个类型,因为它是List of some type 'T'

现在回答我的问题。

class Foo a where
  bar :: String -> a

然后,我尝试创建Foo [String]。我的理解是a中的Foo a[String]。因此,我希望bar返回[String]

instance Foo [String] where
    bar []    = []
    bar (x:_) = [x]

但是,我得到以下编译时错误:

ghci> :l TypeClassExample.hs 
[1 of 1] Compiling Main             ( TypeClassExample.hs, interpreted )

TypeClassExample.hs:5:10:
    Illegal instance declaration for `Foo [String]'
      (All instance types must be of the form (T a1 ... an)
       where a1 ... an are *distinct type variables*,
       and each type variable appears at most once in the instance head.
       Use -XFlexibleInstances if you want to disable this.)
    In the instance declaration for `Foo [String]'
Failed, modules loaded: none.

我犹豫是否在不理解它的情况下添加此编译时标志。

这个简单的代码有什么意义?

1 个答案:

答案 0 :(得分:3)

Haskell语言定义非常严格,只允许列表实例具有

形式
instance ... => Foo [a] where

在头部a中的位置恰好是类型变量a,不允许[Int][String]

但是,您可以要求GHC忽略此限制。只需在文件的开头添加以下内容:

{-# LANGUAGE FlexibleInstances #-}

许多现代Haskell程序都在使用它。可以说,在下一个Haskell定义修订版中,应该集成这个GHC功能。