为什么这种类型的单一用法会编译,但将其放入列表会失败呢?
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'发布于 2015-01-12 05:04:32
这种对Haskell类型系统的限制是为了简化类型推断和检查。具有谓词秩-1类型的类型推理(见下文)是可判定的,并且具有相对简单的实现。具有秩-2类型的类型推理是可判定的,但相当复杂,以至于我不知道任何语言实现了秩-2类型推断。等级3及以上的类型的类型推断是不确定的.非谓词类型也使事情变得相当复杂;GHC过去有一个实现,允许对非谓词类型进行类型检查(和一些非常有限的推断),但是它太复杂了,后来被删除了。(目前GHC仍然接受一些只带有非谓词类型的类型类型的值,但我认为这并不是一个“稳定”的特性。)
快速定义:秩-1类型具有“外部”类型的所有量化和类约束,因此所有秩-1类型都是形式的。
forall a_1 ... a_m. (C_1, ..., C_n) => t秩-2类型允许函数参数具有秩-1类型;在一般情况下,秩n类型允许函数参数具有秩(n-1)类型。
预测回答了什么类型可以替代类型变量的问题。如果只有单形类型(尽管有潜在的类型变量!)可以替换,您处于谓词系统中;非谓词类型允许您用多态类型替换类型变量。通过推广,谓词系统中的参数数据类型只能接受单纯类型作为参数。因此,例如,将[]类型构造函数应用于forall t a. (Foldable t, Num a) => t a -> a类型的示例试图将构造函数应用于多态类型,因此仅在非谓词系统中有效。
https://stackoverflow.com/questions/27895196
复制相似问题