为什么我不能在创建类型类实例时强调(忽略)类型变量?

时间:2015-01-14 14:37:55

标签: haskell instance typeclass

这是一个简单的例子:

data T a b = T a b deriving (Show)

instance Functor (T a) where
    fmap f (T x y) = T x (f y)

为什么我不能省略实例声明中的a,并编写如下内容:

instance Functor (T _) where

a的类型显然与该实例无关! (在我看来,真的更具可读性。)

很明显,我们可以忽略函数参数的。为什么不允许忽略类型变量的值?

1 个答案:

答案 0 :(得分:6)

简而言之,输入类实例参数并不遵守模式匹配规则,_的设计符合我的要求。

Haskell明确禁止创建类型变量重复的实例:

  

实例声明引入了类的实例。让类cx => C u其中{cbody}是一个类声明。相应实例声明的一般形式为:instance cx′ => C (T u1 … uk) where { d }其中k≥0。类型(T u 1 ... u k )必须采用以下形式:类型构造函数T应用于简单类型变量u 1 ,... u k ;此外,T不能是类型的同义词,并且ui必须都是不同的。

     

这禁止实例声明,例如:

 instance C (a,a) where ...  
 instance C (Int,a) where ...  
 instance C [[a]] where ...

" type-pattern-match"在实例中声明很可能更复杂,可能会有不同的含义,所以我可以看到为什么_没有被引入;。