Haskell 中的“模式匹配”类型

2024-01-12

我想要一个功能f作为增量Ints 并作为所有其他类型的标识。我尝试启用TypeApplications扩展并以最直接的方式执行此操作:

f :: forall a. a -> a
f @Int x = x + 1
f @_   x = x

但扩展不启用此类模式:

<interactive>:6:1: error: Parse error in pattern: f @Int

Haskell 中是否有类型模式匹配(或类似机制)?


如上所述,这在 Haskell 中是不可能实现的,因为它会违反参数多态性的基本属性之一,称为“参数性”,它确保任何多态函数满足称为“自由定理”的特定属性。

特别是,类型的终止函数forall a. a -> a必须是身份。没有其他可能的实现。

话虽这么说,如果我们允许对类型进行约束a,这成为可能。通常,运行时类型测试是通过 Haskell 完成的Typeable类型类别:

f :: forall a. Typeable a => a -> a
f x = case eqT @a @Int of    -- Is a ~ Int ?
   Just Refl -> x + 1        -- If it is, we can add one.
   Nothing   -> x            -- Otherwise, return x as-is.

这需要一堆 GHC 扩展,并导入Data.Typeable https://hackage.haskell.org/package/base-4.15.0.0/docs/Data-Typeable.html.

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

Haskell 中的“模式匹配”类型 的相关文章

  • 映射存在类型列表

    我有一个要映射的存在类型对象的列表 像这样的东西 sealed abstract class IntBox val v Int case object IB1 extends IntBox 1 case object IB2 extends
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • System.Web.HttpException 无法加载类型“[命名空间].???”

    这开始于无法加载类型 全局 错误 在我尝试了一些方法后 没有找到删除 Global asax 文件的位置 现在错误是无法加载类型 namespace 在哪里 是我尝试加载的每个页面的类名 该网站 在 VS2008 本地开发计算机中执行时 工
  • TypeScript:实现具有调用签名和索引签名的接口

    我想创建一个满足此类型的对象 interface I string x string number 并通过 TypeScript 类型检查 理想情况下 我希望不需要诉诸技巧 例如使用any作为中间步骤 我知道可以将其他字段添加到具有调用签名
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • Powershell日期类型无法找到

    我正在尝试使用PowerShell连接virustotal API 代码来自virustotal网站 我得到 无法找到类型 System Security Cryptography ProtectedData 错误信息 代码如下 funct
  • 如何在 Haskell 中漂亮地打印表格?

    我想在 Haskell 中漂亮地打印一个类似表格的数据结构 列列表 例如 Table StrCol strings a bc c IntCol ints 1 30 2 DblCol doubles 2 0 4 5 3 2 应该渲染类似 st
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Haskell / GHC - 是否有“警告不完整模式”的中缀标签/编译指示

    我正在寻找一个可以对特定的不完整模式发出警告的编译指示 它会使编译器失败并显示以下 假设的 代码 FAILIF incomplete patterns f Int gt Int f 0 0 我正在尝试使用 Arrows 编写一个 编译器 并
  • 在学术 CS 世界中,“非类型化”是否也意味着“动态类型化”?

    我正在阅读一个幻灯片 上面写着 JavaScript 是无类型的 这与我的想法相矛盾 所以我开始挖掘并尝试了解更多信息 每个答案JavaScript 是一种无类型语言吗 https stackoverflow com questions 9
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • 为什么我在 MySQL 中设置更大的 INT 数据类型长度时没有收到错误消息?

    我对 MySql 中的数据类型长度有点困惑 我阅读了参考手册http dev mysql com doc refman 5 0 en data types html http dev mysql com doc refman 5 0 en
  • std::bind 重载解析

    下面的代码工作正常 include

随机推荐