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

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显然与那个实例无关!(那将是真正的在我看来更具可读性).

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

Bar*_*icz 6

简而言之,类型类实例参数不遵守模式匹配的规则,因为模式匹配的_设计符合我的要求.

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必须都是不同的.

这禁止实例声明,例如:

 instance C (a,a) where ...  
 instance C (Int,a) where ...  
 instance C [[a]] where ...
Run Code Online (Sandbox Code Playgroud)

在实例声明中"类型模式匹配"的可能性很可能更复杂,可能有不同的含义,所以我可以看到为什么_没有引入;

  • 当然,这个限制使__________在实例中允许`_`是可接受的,因为它回答了"实例C(T _ _)"中的两个`_`是否相等的模糊性问题?坚定地说"不!",并且实际上提出了一种简单地插入新类型变量名来代替每个下划线的实现策略.我的意思是,它不像`faa = a`是一个有效的函数定义. (2认同)