作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与 PatternSynonyms
( explicitly bidirectional form ),pattern-to-expr 方程实际上形成了一个函数,但拼写为大写(假设您最终得到正确类型的完全饱和的数据 constr)。然后考虑(在 GHC 8.10.2)
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
data Nat = Zero | Succ Nat deriving (Eq, Show, Read)
-- Pattern Synonyms as functions?
pattern Pred :: Nat -> Nat
pattern Pred n <- {- what goes here? -} where
Pred (Succ n) = n
pattern One = Succ Zero
zero = Pred One -- shows as Zero OK
那么我应该为
pattern Pred n <- ???
放什么?值(value)模式顶线?或者我可以不使用
Pred n
在模式匹配中?似乎有效(但我不明白为什么)是一种 View 模式
pattern Pred n <- (Succ -> n) where ... -- seems to work, but why?
isZero (Pred One) = True
isZero _ = False
-- isZero (Pred One) ===> True ; isZero Zero ===> True
-- isZero (Succ One) ===> False; isZero One ===> False
使用起来看起来很甜蜜
Pred
作为这里的伪构造函数/模式,因为它是一个单射函数。
最佳答案
考虑您的模式同义词的这种用法:
succ' :: Nat -> Nat
succ' (Pred n) = n
当然,其意图是返回参数的后继。
k
, 然后变量
n
必须绑定(bind)到
Succ k
.鉴于这种直觉,我们需要找到一个完全可以做到这一点的模式,一个可以在这里使用而不是
Pred n
的模式。 :
succ' :: Nat -> Nat
succ' ({- bind n to Succ k -}) = n
事实证明,您的 View 模式正是这样做的。这会很好用:
succ' :: Nat -> Nat
succ' (Succ -> n) = n
因此,我们必须定义
pattern Pred n <- (Succ -> n)
在我自己(有限的)经验中,这是相本地道的。当您拥有双向模式同义词时,您通常会使用上述 View 模式。
关于haskell - 模式同义词作为函数的无趣/困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65808951/
You can pass a list of paths to git bisect这样只有提交更改这些文件才会被测试: You can further cut down the number of
我是一名优秀的程序员,十分优秀!