Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 多参数类型类的类型统一_Haskell - Fatal编程技术网

Haskell 多参数类型类的类型统一

Haskell 多参数类型类的类型统一,haskell,Haskell,现在,这不起作用:强制0::Int 但如果将实例替换为该实例,则表达式将起作用: {-# LANGUAGE MultiParamTypeClasses #-} class Coerce a b where coerce :: a -> b instance Coerce a a where coerce a = a 为什么?我可以告诉你为什么第一个不起作用 强制可以为任何可能的类型对定义强制0::Int被解析为(强制0)::Int。因此,您已经用类型注释修复了a->b中的b,而不是a 数

现在,这不起作用:
强制0::Int
但如果将实例替换为该实例,则表达式将起作用:

{-# LANGUAGE MultiParamTypeClasses #-}
class Coerce a b where coerce :: a -> b
instance Coerce a a where coerce a = a

为什么?

我可以告诉你为什么第一个不起作用

强制
可以为任何可能的类型对定义<代码>强制0::Int被解析为
(强制0)::Int
。因此,您已经用类型注释修复了
a->b
中的
b
,而不是
a

数值文本是多态的,因此
0
具有类型
Num a=>a
。那是行不通的;没有实例匹配
强制Int
。可能有
强制双Int
强制复合Int
等,因此知道
b
Int
不足以推断
0
Int
。我们需要说
强制(0::Int)::Int
来修复这两个类型参数

我相信第二种方法是有效的,因为实例声明上的约束不用于帮助解析类型类<代码>实例a~b=>强制a b完全匹配,就像您编写的
实例强制a b
一样。也就是说,这是可能的最通用实例(为了类型类解析的目的),它很好地匹配了对
强制
的任何可能调用(因此您不能编写任何其他非重叠实例)。
a~b
约束仅在选择实例后应用


由于您有一个实例与任何内容都匹配,因此为
强制0::Int
选择一个实例是没有问题的,尽管我们仍然存在同样的问题,即不知道
0
是什么类型。但是在实例选择之后,我们现在有了额外的约束
a~Int
,它允许将明确的类型分配给所有对象。

然而,尽管
实例a~b=>强制a b
单独工作,但它也将与您想要编写的所有其他可能的实例重叠,使整个课堂毫无用处。这个问题有点类似于
instance a ~ b => Coerce a b where coerce x = x