为什么我不能使用具有存在量化类型的记录选择器?

2024-03-15

当使用存在类型时,我们必须使用模式匹配语法来提取forall编辑值。我们不能将普通的记录选择器用作函数。 GHC 报告错误并建议使用与此定义的模式匹配yALL:

{-# LANGUAGE ExistentialQuantification #-}

data ALL = forall a. Show a => ALL { theA :: a }
-- data ok

xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok

-- ABOVE: heaven
-- BELOW: hell

yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed

forall.hs:11:19:
    Cannot use record selector `theA' as a function due to escaped type variables
    Probable fix: use pattern-matching syntax instead
    In the second argument of `($)', namely `theA all'
    In the expression: show $ theA all
    In an equation for `yALL': yALL all = show $ theA all

我的一些数据包含超过 5 个元素。如果我很难维护代码 使用模式匹配:

func1 (BigData _ _ _ _ elemx _ _) = func2 elemx

有没有一种好的方法可以使这样的代码可维护或将其包装起来以便我可以使用某种选择器?


存在类型比常规类型以更复杂的方式工作。 GHC(正确地)禁止您使用theA作为一个函数。但想象一下没有这样的禁令。该函数的类型是什么?它必须是这样的:

-- Not a real type signature!
theA :: ALL -> t  -- for a fresh type t on each use of theA; t is an instance of Show

非常粗暴地说,forall使 GHC“忘记”构造函数参数的类型;类型系统只知道该类型是以下类型的实例Show。因此,当您尝试提取构造函数参数的值时,无法恢复原始类型。

GHC 在幕后所做的就是上面对假类型签名的注释所说的——每次你与ALL构造函数中,绑定到构造函数值的变量被分配一个唯一的类型,保证与其他类型不同。以这段代码为例:

case ALL "foo" of
    ALL x -> show x

变量x获取一个与程序中的所有其他类型不同的唯一类型,并且不能与任何类型变量匹配。这些独特的类型不允许逃逸到顶层——这就是为什么theA不能用作函数。

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

为什么我不能使用具有存在量化类型的记录选择器? 的相关文章

随机推荐

  • Drupal 7在自定义主题中覆盖jquery js文件

    是否可以重写 覆盖自定义模板脚本变量中使用的默认 Drupal 7 26 jquery 我的意思是js文件之一 通过自定义主题来的一个 我试过这个sites all MYTPL template php但它不起作用 scripts misc
  • 不在映射中的字段包含在 ElasticSearch 返回的搜索结果中

    我想使用 Tire gem 作为 ElasticSearch 的客户端来索引 pdf 附件 在我的映射中 我从 source 中排除附件字段 以便附件不会存储在索引中 并且未在搜索结果中返回 mapping source gt exclud
  • Visual Studio Android 模拟器网络不工作

    I started using xamarin in visual studio and I installed visual studio android emulator Emulator works flawlessly but ne
  • 编辑超链接 Excel 2010 宏

    好的 我想创建一个宏来替换超链接的一部分 我的 Excel 文件中有大量的超链接 有没有办法创建一个宏来做到这一点 例如 www OldName com www Oldname com a www Oldname com b to www
  • C++ 非阻塞异步定时器

    我读过很多关于这个问题的帖子 但没有找到这个问题的答案 我想制作一个在后台运行并在完成后执行某些操作的计时器类 甚至我想一次调用多个异步倒计时的计时器 我在搜索这个类时发现了它 它似乎有效 但不在后台 我怎样才能将它转换为我想要的 Time
  • 如何在jquery mobile中初始化页面? pageinit 未触发

    在 jquery 移动页面上初始化对象的正确方法是什么 这事件文档 http jquerymobile com test docs api events html说使用 pageInit 没有该函数的示例 但给出了绑定到 的示例pagein
  • 在 iphone 应用程序中使用来自 sharekit 的 twitter 时无法验证 OAuth

    我正在 iphone 应用程序中使用 sharekit 实现 facebook 和 twitter 共享 Facebook 共享工作正常 但 twitter 共享出现错误 无法验证 OAuth 我遇到了同样的问题 这解决了它 https g
  • 使用 Fluent Nhibernate Table-Per-Subclass 策略时可以指定标识列吗?

    我正在创建一个 Fluent N hibernate 子类映射 目前看起来像这样 public class TaskDownloadMap SubclassMap
  • Github Actions,如何在作业步骤之间共享计算值?

    是否有一种 DRY 方法可以使用 Github Actions 在多个作业步骤中计算和共享值 在下面的工作流程 yml 文件中 回声 GITHUB REF 剪切 d f3 GITHUB SHA 在多个步骤中重复 name Test Buil
  • 用于自定义日志的 Logstash Grok 过滤器

    我有两个相关问题 第一个是如何最好地处理具有 混乱 间距等的日志 第二个 我将单独询问 是如何处理具有任意属性值对的日志 看 Logstash Grok 过滤器用于具有任意属性值对的日志 https stackoverflow com qu
  • Marshmallow 应用程序权限撤销通知? [复制]

    这个问题在这里已经有答案了 在 Android 6 0 Marshmallow 中 用户可以撤销特定的应用程序权限 即使是从应用程序内部授予该权限也是如此 我知道我可以检查权限ContextCompat checkSelfPermissio
  • 启动spark shell时出错

    我刚刚下载了最新版本的 Spark 当我启动 Spark shell 时 出现以下错误 java net BindException Failed to bind to 192 168 1 254 0 Service sparkDriver
  • 自定义 ListView 与 RadioButton 单选

    我希望你们中的一些人可以帮助我解决这个问题 我有一个自定义列表视图 2 个文本视图和 1 个单选按钮 我想把它作为单一选择 但每次我 单击列表视图上的项目 它不会删除该项目 从另一个单选按钮 检查 我的xml代码
  • C# - 方法的自动委托类型

    任何避免显式声明的方法MyMethodDelegate在这样的场景下 bool MyMethod string x BeginInvoke new MyMethodDelegate MyMethod x 我了解 lambdas a la g
  • C语言精确计时

    我下面有一些代码 我使用这段代码输出一些 1 和 0 unsigned output 38 来自嵌入式板的 GPIO 我的问题 两个输出值 1 0 或 0 1 之间的时间应该是416微秒正如我所定义的clock nanosleep下面的代码
  • 嵌套整数字段上的 Postgres jsonb 索引

    我的 postgres 数据库中有以下数据结构 一个名为的 jsonb 列customer RequestId 00000000 0000 0000 0000 000000000000 Customer Status A AccountId
  • 如何在同一个 select 语句中使用 count 和 group by

    我有一个SQLSELECT查询也使用GROUP BY 我想统计之后的所有记录GROUP BY子句过滤结果集 有什么办法可以直接用SQL来实现这个功能吗 例如 如果我有桌子users并想要选择不同的城镇和total用户数量 SELECT to
  • 为什么 Vue.js Chrome Devtools 没有检测到 Vue.js?

    我有一个简单的工作 Vue js 应用程序的以下代码 但 Vue js 开发工具没有响应 前几天还好好的 现在就不行了 可能是哪里出了问题 当我去webstore https chrome google com webstore detai
  • 使用 edmx 文件时如何指定连接字符串中的元数据位置

    我有一个 Web 项目 其数据模型在 edmx 文件中定义 连接字符串的开头如下 元数据 res 这一段时间以来效果很好 但是参与该项目的其他人创建了一个也使用实体框架的 dll 并将其添加到 bin 文件夹中 现在 当我尝试创建连接时 加
  • 为什么我不能使用具有存在量化类型的记录选择器?

    当使用存在类型时 我们必须使用模式匹配语法来提取forall编辑值 我们不能将普通的记录选择器用作函数 GHC 报告错误并建议使用与此定义的模式匹配yALL LANGUAGE ExistentialQuantification data A