RankNTypes 与类型别名混淆[重复]

2024-02-13

我试图了解类型约束如何与类型别名一起使用。首先,假设我有下一个类型别名:

type NumList a = Num a => [a]

我有下一个功能:

addFirst :: a -> NumList a -> NumList
addFirst x (y:_) = x + y

此函数失败并出现下一个错误:

Type.hs:9:13: error:
    • No instance for (Num a) arising from a pattern
      Possible fix:
        add (Num a) to the context of
          the type signature for:
            addFirst :: a -> NumList a -> a
    • In the pattern: y : _
      In an equation for ‘addFirst’: ad

这是显而易见的。这个问题已经在这里描述过:

了解具有类约束的 2 级类型别名 https://stackoverflow.com/questions/14585220/understanding-a-rank-2-type-alias-with-a-class-constraint

我明白为什么我们需要{-# LANGUAGE RankNTypes #-}此类类型别名是否有效以及为什么前面的示例不起作用。但我不明白的是为什么下一个例子编译得很好(在 ghc 8 上):

prepend :: a -> NumList a -> NumList a
prepend = (:)

当然它失败了ghci如果我尝试传递错误的值:

λ: prepend 1 []
[1]
λ: prepend "xx" []

<interactive>:3:1: error:
    • No instance for (Num [Char]) arising from a use of ‘prepend’
    • When instantiating ‘it’, initially inferred to have
      this overly-general type:
        NumList [Char]
      NB: This instantiation can be caused by the monomorphism restriction.

似乎类型类型检查在运行时延迟:(

而且,一些简单的似乎是同一段代码无法编译:

first :: NumList a -> a
first = head

并产生下一个错误:

Type.hs:12:9: error:
    • No instance for (Num a)
      Possible fix:
        add (Num a) to the context of
          the type signature for:
            first :: NumList a -> a
    • In the expression: head
      In an equation for ‘first’: first = head

有人可以解释一下这是怎么回事吗?我希望函数类型检查与否具有一定的一致性。


似乎类型类型检查在运行时延迟:(

并不真地。这里可能有点令人惊讶,因为你在 ghci 中遇到了类型错误after加载文件后。不过可以解释一下:文件本身完全没问题,但这并不意味着all您可以使用其中定义的函数构建的表达式将是类型良好的。

高级多态性与此无关。(+)例如在前奏中定义但如果你尝试评估2 + "argh"在 ghci 中,你也会得到一个类型错误:

No instance for (Num [Char]) arising from a use of ‘+’
In the expression: 2 + "argh"
In an equation for ‘it’: it = 2 + "argh"

现在,让我们看看问题出在哪里first:它声称给定NumList a,它可以产生一个a, 无话可问。但我们知道如何建造NumList a凭空!确实是Num a约束意味着0 is an a并使得[0]一个完全有效的NumList a。这意味着如果first当时被接受all居住类型:

first :: NumList a -> a
first = head

elt :: a
elt = first [0]

尤其Void https://hackage.haskell.org/package/void-0.7.1/docs/Data-Void.html也会是:

argh :: Void
argh = elt

确实啊!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RankNTypes 与类型别名混淆[重复] 的相关文章

随机推荐

  • Numpy 数组切片返回切片数组和相应的数组索引

    我正在尝试从一个数组生成两个 numpy 数组 一个是原始数组的切片 另一个表示可用于查找生成的值的索引 我可以解释这一点的最好方法是通过示例 import numpy as np original np array 5 3 7 3 2 8
  • PostgreSQL:文本到 JSONB - 总大小超过最大值

    我已在文本字段中导入 JSON 数组 并希望将其转换为 JSONB 我收到以下错误 SQL错误 54000 错误 jsonb数组元素的总大小超过最大值268435455字节 错误 jsonb 数组元素的总大小超过最大值 268435455
  • 激活负颜色后图形奇怪地滑动

    我正在使用 Highcharts 在移动图表中显示一些实时变化的数据 每秒添加一个点 就像更新 highcharts 网站上的样条线示例 http www highcharts com demo dynamic update 为了清楚地看到
  • mysql 使用 unix_timestamp 变量进行分区

    鉴于这种 delimiter create procedure setup begin declare d datetime set d rounddate now create table s time req id int not nu
  • Django 比较模型实例是否相等

    据我所知 在单例情况下 您可以执行以下操作 spam eggs and if spam and eggs是具有所有相同属性值的同一类的实例 它将返回True 在 Django 模型中 这是很自然的 因为模型的两个单独实例永远不会相同 除非它
  • char** 与 char* c[] 访问字符串数组

    为什么我不能将 char 指向 C 字符串数组 int main int argc char argv char c1 Hey Hello printf s c1 1 works fine vs int main int argc char
  • 使用 PHP SplFileObject 和 READ_CSV 标志时如何删除多余的行?

    使用 PHP 迭代 csv 文件时Spl文件对象 http php net manual en class splfileobject php和READ CSV标记我得到一个额外的行null价值 有没有办法自动删除这一行 file new
  • 如何在作业后脚本中使用 JUnit XML 格式获取 Jenkins 中运行的测试数量?

    有没有什么方法可以获取 Jenkins 在 Post Job 脚本中执行 或通过 的测试数量 例如 将此号码发送到 Github Status API 我没有看到任何方法可以直接访问这些号码Publish JUnit test result
  • 如何在MySQL中实现多对多的层次结构

    这是我的问题的后续内容 如何在MySQL中记录记录的顺序集合 https stackoverflow com questions 9610942 how to record sequential collections of records
  • Android ListView 禁用标题视图上的点击和上下文菜单?

    我使用设置标题视图getListView addHeaderView view 目前 在点击和上下文菜单方面 它的处理方式与所有其他列表行相同 如何使标题视图更像标题 或者 我怎样才能在上面添加一些内容ListView这不属于ListVie
  • 没有 scipy 的 numpy 中的批量卷积 2d?

    我有一批b m x n图像存储在数组中x 和一个卷积滤波器f大小的p x q我想应用于每个图像 然后使用总和池并存储在数组中y 在批次中 即all np allclose y i j k x i j j p k k q f sum for
  • 插入新实例时不执行实体框架核心延迟加载

    我有两节课 Campaign它引用了一个类客户 public class Campaign Key Required public int id get set public int CustomerId get set ForeignKe
  • 碰撞时阻止移动

    我正在 XNA 中开发 2d 游戏 目前正在上物理课 我当前的任务是在一个物体与另一个物体碰撞时阻止它 我让我的游戏在两个物体发生碰撞时调用此函数 public void BlockMovement gameObject target yo
  • 单击日历时使用 fullcalendar 创建事件(rails)

    当用户单击日历的任何部分时 如何创建事件 然后将其作为新事件存储在数据库中 我知道你必须使用 select function start end allDay 来获取 开始 和 结束 时间 但是当我得到这些数据后 如何将其传递到数据库呢 T
  • Rails 控制台添加 nil 而不是值

    目前 当尝试通过 Rails 控制台或种子数据将新用户添加到我的用户表时 一切都为零 在我的种子文件中 我正在运行 u1 User create from email gt email protected cdn cgi l email p
  • 捕获正则表达式匹配以从查找表中进行替换

    我正在 PowerShell 中编写一个语言解释器 该语言是 PILOT 对于那些可能感兴趣的人 并且我已经达到了实现变量替换的地步 变量名由以下任一组成 or a 后跟该集中最多十个字符 A Za z0 9 但是 如果变量名带有前缀 它应
  • Codeigniter 中的注销功能

    我开始在我的项目中使用 codeigniter 我的网站有用户身份验证系统 我看过 nettuts 的视频以获取登录信息 我很困惑为什么注销不能正常工作 我的登录控制器中有以下注销功能 function logout this gt ses
  • Python 在 Windows 8.1 64 位上错误地检测到 32 位系统

    PS C Users gt C Python27 python exe Python 2 7 15 v2 7 15 ca079a3ea3 Apr 30 2018 16 30 26 MSC v 1500 64 bit AMD64 on win
  • 单表内SQL时间差

    我有一个包含用户登录数据的 MySQL 表 user date type 1 2011 01 05 08 00 00 login 1 2011 01 06 09 00 00 login 1 2011 01 06 10 00 00 logou
  • RankNTypes 与类型别名混淆[重复]

    这个问题在这里已经有答案了 我试图了解类型约束如何与类型别名一起使用 首先 假设我有下一个类型别名 type NumList a Num a gt a 我有下一个功能 addFirst a gt NumList a gt NumList a