Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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,为什么这种类型的单一用法可以编译,但将其放入列表失败 ft1 :: (Foldable t, Num a) => t a -> a ft1 = (F.foldl (+) 0) fTest :: [(Foldable t, Num a) => t a -> a ] fTest = [ F.foldl (+) 0 ] 后者给出了错误: folding.hs:80:10: Illegal polymorphic or qualified type:

为什么这种类型的单一用法可以编译,但将其放入列表失败

ft1  :: (Foldable t, Num a) => t a -> a
ft1   =   (F.foldl (+)  0)

fTest :: [(Foldable t, Num a) => t a -> a ]
fTest = [ F.foldl (+)  0 ]
后者给出了错误:

folding.hs:80:10:
    Illegal polymorphic or qualified type:
      (Foldable t, Num a) => t a -> a
    Perhaps you intended to use ImpredicativeTypes
    In the type signature for `fTest':
      fTest :: [(Foldable t, Num a) => t a -> a]
同样,尝试命名失败(不同):


对Haskell类型系统的这种限制是为了简化类型推断和检查。具有谓词秩1类型的类型推断(见下文)是可判定的,并且具有相对简单的实现。具有秩-2类型的类型推理是可判定的,但相当复杂,以至于我不知道任何具有秩-2类型推理实现的语言。等级3及以上的类型的类型推断是完全不可判定的。非指示性类型也使事情变得相当复杂;GHC曾经有一个允许使用非指示类型进行类型检查(以及一些非常有限的推断)的实现,但它太复杂了,后来被删除了。(GHC目前仍然接受一些仅使用非指示性类型进行类型检查的值,但我认为这不是一个“稳定”的特性。)

快速定义:rank-1类型的所有量化和类约束都在该类型的“外部”,因此所有rank-1类型的形式都相同

forall a_1 ... a_m. (C_1, ..., C_n) => t
秩-2类型允许函数参数具有秩-1类型;一般来说,秩n类型允许函数参数具有秩(n-1)类型


谓词性回答了什么类型可以替代类型变量的问题。如果只能替换单态类型(尽管可能有类型变量!),则表示您处于谓词系统中;非指示类型允许用多态类型替换类型变量。通过扩展,谓词系统中的参数化数据类型只能接受单态类型作为参数。因此,例如,您的示例将
[]
类型构造函数应用于所有t的类型
。(Foldable t,Num a)=>ta->a
正在尝试将构造函数应用于多态类型,因此仅在非指示性系统中有效。

作为猜测:也许您的意思是
fTest::(Foldable t,Num a)=>[ta->a]
?谢谢;我想我已经试过了,但它确实有效。但是仍然尝试使用类型别名命名同一类型(如上面的Ftst)失败(无论是否使用列表符号)-为什么?谢谢,我以前没有尝试过,这非常有用。有趣的是,将量化移到列表构造函数之外确实有效(上面的注释)。乍一看,这似乎是同一个问题——将列表构造函数应用于多态类型,只是声明不同而已。我不清楚为什么即使是这种经过调整的形式
(Foldable t,Num a)=>[ta->a]
也可以用在类型签名中,但不能用在类型别名中。@guthrie区别在于上下文
(Foldable t,Num a)
(对于所有
,都需要隐式
)是在列表类型构造函数的内部还是外部。至于类型别名,因为它们可以出现在任何地方(包括作为函数参数的类型),所以它们必须是单态的,所有结果类型都必须是秩1。
forall a_1 ... a_m. (C_1, ..., C_n) => t