模式匹配中的评估顺序是否有任何保证?

2024-01-08

下列

(&&) :: Bool -> Bool -> Bool
False && _ = False
True && False = False
True && True = True

具有所需的短路特性False && undefined ≡ False。第一个子句在正确的参数中是非严格的,保证在尝试其他任何内容之前进行检查。

显然,如果我改变顺序甚至取消函数,它仍然有效

both :: (Bool,Bool) -> Bool
both (True,False) = False
both (True, True) = True
both (False, _) = False

Prelude> both (False, undefined)
False

但这实际上是由标准保证的吗?与子句的顺序不同,模式的评估顺序在这里并不那么清晰。我真的可以确定匹配吗(True,False)将立即中止(False,_)在评估 snd 元素之前就确定了?


是的,可以保证计算表达式both (False, undefined)不会发散,因为数据构造函数上的匹配保证从左到右与构造函数的组件匹配,并且一旦某些子模式失败,该模式就会失败。由于元组的第一个元素是False,该模式对于两者都会失败(True, ...)一旦第一个元素无法匹配就分支。

Per the Haskell 2010 报告,第 3.17.2 节 https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-600003.17.2,它给出了模式匹配的非正式语义:

  1. Matching the pattern con pat1 … patn against a value, where con is a constructor defined by data, depends on the value:
    • 如果值的形式为con v1 … vn,子模式从左到右与数据值的组成部分进行匹配;如果所有匹配都成功,则整体匹配成功;第一个失败或发散会分别导致整个匹配失败或发散。
    • 如果值的形式为con′ v1 … vm,其中 con 是一个不同的构造函数con′,匹配失败。
    • 如果值为 ⊥,则匹配发散。

由于元组语法只是数据构造函数的特殊情况语法糖,因此上述内容适用。

要更全面地处理模式匹配,请参阅Haskell 2010 报告第 3.17.3 节 https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-610003.17.3,它给出了模式匹配的形式语义(具体来说,图 3.2 属于这个问题)。

另一个有趣的资源是论文Haskell 中的模式驱动归约 http://programatica.cs.pdx.edu/P/journal-wrs2002.pdf它将语义指定为 Haskell 具体语法的抽象语法表示的解释器(用 Haskell 编写)(函数mP图 3 第 7 页与该问题相关)。

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

模式匹配中的评估顺序是否有任何保证? 的相关文章

  • 我在 Python 中查找重复循环的正则表达式模式有什么问题?

    我想匹配任何具有重复循环的字符串 就像这个数据一样 3333333333333333333333333333333333333333 1 digit cycle 3 1666666666666666666666666666666666666
  • 将相同变量绑定到共享特征的不同类型的模式

    我有一个关于通过特征共享某些行为的值的模式匹配的问题 我有一个带有两个变体的枚举 每个变体都有不同类型的绑定值 其中两种类型都实现一个特征 我试图弄清楚是否可以创建一个单一的模式 E VarA x E VarB x 形式 其中我将两种类型绑
  • 机器和管道(或其他类似的库)之间的概念区别是什么?

    我想学习这个概念 以便我能够理解和使用诸如machines http hackage haskell org package machines 我试着跟随R nar Bjarnason 关于机器的演讲 https dl dropbox co
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • Accelerate 和 Repa 是否有不同的用例?

    我一直在玩 Repa 和 Accelerate 它们都很有趣 但我不知道何时使用其中一个 何时使用另一个 他们是一起成长 是竞争对手 还是只是为了解决不同的问题 Repa 是一个用于高效数组构建和遍历的库 用 Haskell 编程并在 Ha
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • Haskell 中函数和函子有什么区别?只有定义吗?

    在 Haskell 中 当编写函数时 这意味着我们将某个东西 输入 映射到另一个东西 输出 我尝试 LYAH 来理解 Functor 的定义 看起来和普通 Functor 一样 函数被称为函子有什么限制吗 Functor 是否允许有 I O
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • Haskell,堆栈:找到可执行文件

    我正在寻找类似的东西 stack whereis hasktags where whereis行为或多或少类似于 UNIXwhereis命令 hasktags是这样运行的 stack exec hasktags stack exec whe
  • “Eta减少”并不总是在Haskell中举行?

    我发现我可以说 LANGUAGE RankNTypes f1 forall b b gt b gt forall c c gt c f1 f id f HLint 告诉我我可以在这里做 Eta 减少 但是 f2 forall b b gt
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • Haskell 中的中缀运算符优先级

    对于以下 Haskell 表达式 返回 a gt gt f 应该读作 返回a gt gt f or 返回 a gt gt f 这里的相关规则是什么 规则始终是函数应用程序的优先级高于任何运算符 因此 return a gt gt f 被解析

随机推荐