Haskell - 非法多态类型?

2024-01-27

为什么该类型单独使用可以编译,但放入列表却失败?

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(使用前将#替换为@)

Haskell - 非法多态类型? 的相关文章

随机推荐

  • 使用 AppCompatActivity 时 onCreate() 处显示错误

    我将 SDK 更新到 22 Android 5 1 1 然后我使用AppCompactActivity代替Activity 这是 logcat 输出 04 23 13 51 40 524 E AndroidRuntime 3150 java
  • HTML 电子邮件的行高在 Outlook 2010 中不起作用

    Outlook 2010 Outlook 2007 似乎不支持我的 HTML 电子邮件中的行高 在 Outlook 00 和 Outlook 03 中完美运行 我一直在进行一些广泛的谷歌搜索 我发现 HTML CSS 支持图表表明 Outl
  • 使用Camera2(Android版本21)API录制60fps视频

    我正在尝试在 Camera2 android hardware camera2 API 上以 60 或更高 fps 的速率录制视频 最后 我使用以下命令成功以 120fps 进行录制相机约束高速捕获会话 https developer an
  • 使用模拟退火进行图形着色

    我正在尝试使用模拟退火提出图形着色问题的算法 网上有通用算法 但是当我查看它时 我无法理解如何将这个算法应用于这个问题 图中的每个节点必须具有与其邻居不同的颜色 我该如何使用模拟退火算法来实现这一点 这个问题中的 温度 时间表 是什么 请帮
  • Visual Studio 从 UML 图生成代码?

    我正在研究使用 Visual Studio 2015 从 UML 图生成代码 根据我所做的工作 我在生成代码之前创建了用例 活动 序列和类图 当我生成代码时 我发现 Visual Studio 在生成代码时仅引用我的类图 所以我的问题是 V
  • 我们如何使用旧语法进行 LEFT JOIN ?

    我们如何使用旧语法进行 LEFT JOIN 假设您有一个 User 表和 UserRole 表 并且您在 User 表中保存了 UserRole 的 ID 以下是检索所有用户名以及具有新表示法的角色名称的查询 SELECT U Userna
  • 将 Objective-C RSA 公钥导入到 c# RSACryptoServiceProvider 中

    这是我们使用以下库生成 RSA 对象的 Objective C https github com kuapay iOS Certificate Key and Trust Sample Project https github com ku
  • 传递浮点变量作为参数

    我正在尝试编写一个方法float参数并使用 PerformSelector 调用它 但我在执行此操作时遇到错误 以下是我的代码 sender performSelector selector withObject progress tota
  • eclipse ASTNode 到源代码行号

    给定eclipse中的ASTNode 有没有办法获取对应的源代码行号 您可以获取某个行的行号ASTNode使用下面的代码 int lineNumber compilationUnit getLineNumber node getStartP
  • 在 PHP 中将粗俗分数转换为数字

    如何将粗俗的分数转换为 PHP 可以用来计算其值的值 例如 3 4 l echo utf8 encode l ord l bin2hex l chr l 会输出类似这样的内容 194 c2be 我们怎样才能把它变成3 4 当从字符串中提取分
  • jQuery 按属性值过滤

    div class selectedColumns a href Driver License State a a href Email a a href Experience Level a a href First Name a a h
  • MySQL存储过程-如何获取最后插入的ID

    我创建了一个存储过程 它将一条记录插入表中并获取该记录的自动递增 ID 我在设置时遇到语法错误LAST INSERT ID 到一个变量中 ERROR 1064 42000 您的 SQL 语法有错误 检查 与您的 MySQL 服务器版本相对应
  • 通过 id 删除骨干模型?

    可以通过id删除模型吗 文档说您需要传入模型本身才能将其删除 所以我需要先获取模型然后删除它 我不能直接通过id删除它吗 您的意思是从集合中删除模型吗 查看文档 似乎您确实需要传递一个真实的模型 但源代码表明您可以只传递一个模型id或型号c
  • 具有唯一键的javascript和es6过滤器数组

    我有一个变量列表 例如 var name list some list console log name list Array 3 0 Object name Johny 1 Object name Monty 2 Object3 name
  • 统一加速

    我正在尝试在 Unity 中模拟加速和减速 我编写了代码来在 Unity 中生成轨道 并根据时间将对象放置在轨道上的特定位置 结果看起来有点像这样 我目前遇到的问题是样条线的每个部分都有不同的长度 并且立方体以不同但均匀的速度穿过每个部分
  • 指定父级 div 的不透明度,但使其不影响子级 HTML 元素

    我在 div 中有一个段落元素 div 的不透明度为 0 3 段落的不透明度为 1 当我显示元素时 该段落看起来是透明的 就像它的不透明度为 0 3 一样 有没有办法让div内的段落完全不透明 也许我可以为此设置一个 CSS 值 div s
  • 跳过没有装饰器语法的单元测试

    我有一套使用 TestLoader 的 来自单元测试模块 loadTestsFromModule 方法加载的测试 即 suite loader loadTestsFromModule module 这给了我一个非常充足的 运行良好的测试列表
  • 在Android模拟器中添加铃声

    有谁知道如何向 Android 模拟器添加 下载铃声或 mp3 声音 Go to DDMS in Eclipse 点击File Explorer选项卡并导航至mnt sdcard 单击创建新文件夹Plus图标称为ringtones 然后单击
  • 哪里可以找到 Android 示例?

    我检查了谷歌开发者网站上的一些 Android 开发练习和示例 我发现了这个网页 http developer android com tools samples index html http developer android com
  • Haskell - 非法多态类型?

    为什么该类型单独使用可以编译 但放入列表却失败 ft1 Foldable t Num a gt t a gt a ft1 F foldl 0 fTest Foldable t Num a gt t a gt a fTest F foldl