Bar*_*icz 7 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)
Run Code Online (Sandbox Code Playgroud)
为什么我不能省略a
实例声明中的内容,并编写如下内容:
instance Functor (T _) where
Run Code Online (Sandbox Code Playgroud)
?
这个类型a
显然与那个实例无关!(那将是真正的在我看来更具可读性).
很明显,我们可以忽略函数参数的值.为什么不允许忽略类型变量的值?
简而言之,类型类实例参数不遵守模式匹配的规则,因为模式匹配的_
设计符合我的要求.
Haskell明确禁止创建类型变量重复的实例:
实例声明引入了类的实例.设class cx => C u其中{cbody}是一个类声明.相应实例声明的一般形式是:
instance cx? => C (T u1 … uk) where { d }
其中k≥0.类型(T u 1 ... u k)必须采用应用于简单类型变量u 1,... u k的类型构造函数T的形式; 此外,T不能是类型的同义词,并且ui必须都是不同的.这禁止实例声明,例如:
Run Code Online (Sandbox Code Playgroud)instance C (a,a) where ... instance C (Int,a) where ... instance C [[a]] where ...
在实例声明中"类型模式匹配"的可能性很可能更复杂,可能有不同的含义,所以我可以看到为什么_
没有引入;