这是一个简单的例子:
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
的类型显然与该实例无关! (在我看来,真的更具可读性。)
很明显,我们可以忽略函数参数的值。为什么不允许忽略类型变量的值?
答案 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"在实例中声明很可能更复杂,可能会有不同的含义,所以我可以看到为什么_
没有被引入;。