首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非法多态类型?

非法多态类型?
EN

Stack Overflow用户
提问于 2015-01-12 04:14:01
回答 1查看 2.1K关注 0票数 5

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

代码语言:javascript
复制
ft1  :: (Foldable t, Num a) => t a -> a
ft1   =   (F.foldl (+)  0)

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

后者给出了错误:

代码语言:javascript
复制
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]

类似地,尝试将其命名为失败(不同):

代码语言:javascript
复制
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'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-12 05:04:32

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

快速定义:秩-1类型具有“外部”类型的所有量化和类约束,因此所有秩-1类型都是形式的。

代码语言:javascript
复制
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类型的示例试图将构造函数应用于多态类型,因此仅在非谓词系统中有效。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27895196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档