首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >惰性模式与“for‘语法匹配的语法

惰性模式与“for‘语法匹配的语法
EN

Stack Overflow用户
提问于 2021-06-14 14:33:32
回答 2查看 280关注 0票数 10

在(vanilla) GHCi 8.6.5中,以下函数是完全有效的:

代码语言:javascript
复制
f xs@ ~(x:xt) = xs

如果我现在在9.0.1中做同样的操作,我会得到一个错误

代码语言:javascript
复制
Suffix occurrence of @. For an as-pattern, remove the leading whitespace.

仅仅删除@~之间的空白似乎是不够的,因为那时@~将被解释为一个运算符,所以我找到的唯一有效的变化是

代码语言:javascript
复制
f xs@(~(x:xt)) = xs

我想知道以下几点,我在变更说明中找不到答案:

  1. 从8.6.5到9.0.1究竟是什么导致了这种不兼容性?
  2. xs@(~(x:xt))真的是编写此模式的最佳方式吗?还是有一种更好的方式来解决这个问题呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-14 14:46:28

描述了在GHC9.0中~和@处理的变化,并对这里进行了描述。引用移徙指南的话:

GHC 9.0实现了提议229,这意味着!、~、和@字符对前面和后面的空格比以前更敏感。因此,过去用一种方式解析的东西现在会以不同的方式进行解析(或者抛出一个解析错误)。

票数 10
EN

Stack Overflow用户

发布于 2021-06-14 20:54:27

添加括号(variable@(~pattern))是一个很好的解决方案。或者,您可以使用letwhere绑定,或者使用单独的惰性case

  1. -> ::a -> a rehead x‘xs0 =x: xs其中_x : xs = xs0
  2. -> ::a -> a rehead x‘xs0 = let _x : xs = xs0 in x’:xs
  3. {-# Language PatternGuards #-} rehead ::a -> a -> a rehead x‘xs0 ->设_x : xs = xs0 = x’:xs 如果您想在后续的保护中使用这些绑定,这可能非常有用。
  4. rehead ::a -> a -> a rehead x‘xs0 = case xs0 of ~(_x : xs) -> x’:xs

所有这些选项都非常懒惰:

  • head (rehead 5 [1, 2])
  • = head (rehead 5 [])
  • = head (rehead 5 undefined)
  • = 5

如果使用{-# Language Strict #-},则必须将let/where绑定编写为~(_x : xs) = xs0以允许[],而list参数绑定为~xs0以允许undefined;要获得不可辩驳的case模式(不仅仅是懒惰),必须编写~(~(_x : xs))

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67972231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档