为什么该类型单独使用可以编译,但放入列表却失败?
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]
同样,尝试命名它失败(不同):
type Ftst t a = (Foldable t, Num a) => t a -> a
folding.hs:80:1:
Illegal polymorphic or qualified type:
(Foldable t, Num a) => t a -> a
Perhaps you intended to use RankNTypes or Rank2Types
In the type declaration for `Ftst'
Haskell 类型系统的这一限制是为了简化类型推断和检查。具有谓词等级 1 类型(见下文)的类型推断是可判定的,并且具有相对简单的实现。 2 级类型的类型推断是可判定的,但相当复杂,以至于我不知道有任何语言可以实现 2 级类型推断。 3 级及以上类型的类型推断是完全不可判定的。命令式类型也会使事情变得相当复杂。 GHC 曾经有一个实现,允许对谓语类型进行类型检查(以及一些非常有限的推理),但它太复杂了,以至于后来被删除了。 (目前 GHC 仍然接受一些仅使用谓语类型进行类型检查的值,但我认为这不被认为是“稳定”功能。)
快速定义:rank-1 类型具有该类型“外部”的所有量化和类约束,因此所有rank-1 类型都具有以下形式
forall a_1 ... a_m. (C_1, ..., C_n) => t
Rank-2 类型允许函数参数具有Rank-1 类型;一般来说,n 级类型允许函数参数具有 (n-1) 级类型。
预测性回答了哪些类型可以替代类型变量的问题。如果只能替换单态类型(尽管可能带有类型变量!),那么您就处于谓词系统中;谓语类型允许您用多态类型替换类型变量。通过扩展,谓词系统中的参数数据类型只能接受单态类型作为参数。因此,例如,您的示例应用了[]
类型构造函数到类型forall t a. (Foldable t, Num a) => t a -> a
试图将构造函数应用于多态类型,因此仅在谓语系统中有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)