在(vanilla) GHCi 8.6.5中,以下函数是完全有效的:
f xs@ ~(x:xt) = xs如果我现在在9.0.1中做同样的操作,我会得到一个错误
Suffix occurrence of @. For an as-pattern, remove the leading whitespace.仅仅删除@和~之间的空白似乎是不够的,因为那时@~将被解释为一个运算符,所以我找到的唯一有效的变化是
f xs@(~(x:xt)) = xs我想知道以下几点,我在变更说明中找不到答案:
xs@(~(x:xt))真的是编写此模式的最佳方式吗?还是有一种更好的方式来解决这个问题呢?发布于 2021-06-14 14:46:28
描述了在GHC9.0中~和@处理的变化,并对这里进行了描述。引用移徙指南的话:
GHC 9.0实现了提议229,这意味着!、~、和@字符对前面和后面的空格比以前更敏感。因此,过去用一种方式解析的东西现在会以不同的方式进行解析(或者抛出一个解析错误)。
发布于 2021-06-14 20:54:27
添加括号(variable@(~pattern))是一个很好的解决方案。或者,您可以使用let或where绑定,或者使用单独的惰性case。
所有这些选项都非常懒惰:
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))。
https://stackoverflow.com/questions/67972231
复制相似问题