Haskell@运算符混淆

Haskell@运算符混淆,haskell,Haskell,我对Haskell函数中的@运算符感到困惑 我想知道添加零n@(成功)=n意味着什么 这是否意味着addNat Zero-Succ b=Succ b?如果name是一个变量名,而pat是一个模式,那么name@pat是一种模式,它在pat匹配时完全匹配,并且还将name绑定到匹配pat的值。因此: data Nat = Zero | Succ Nat deriving (Eq, Show) -- Add two Natural number addNat :: Nat ->

我对Haskell函数中的@运算符感到困惑

我想知道
添加零n@(成功)=n
意味着什么


这是否意味着
addNat Zero-Succ b=Succ b

如果
name
是一个变量名,而
pat
是一个模式,那么
name@pat
是一种模式,它在
pat
匹配时完全匹配,并且还将
name
绑定到匹配
pat
的值。因此:

data Nat = Zero | Succ Nat 
       deriving (Eq, Show)

-- Add two Natural number
addNat :: Nat -> Nat -> Nat 
addNat Zero Zero         = Zero
addNat Zero n@(Succ _)   = n
addNat n@(Succ _) Zero   = n
addNat (Succ x) (Succ y) = Succ (Succ (addNat x y))

表示“如果第一个参数是
Succ
,第二个参数是
Zero
,则返回第一个参数”。

如果
name
是变量名,
pat
是模式,则
name@pat
是一种模式,当pat匹配时,该模式完全匹配,并且还将
name
绑定到与
pat
匹配的值。因此:

data Nat = Zero | Succ Nat 
       deriving (Eq, Show)

-- Add two Natural number
addNat :: Nat -> Nat -> Nat 
addNat Zero Zero         = Zero
addNat Zero n@(Succ _)   = n
addNat n@(Succ _) Zero   = n
addNat (Succ x) (Succ y) = Succ (Succ (addNat x y))

表示“如果第一个参数是
Succ
,第二个参数是
Zero
,则返回第一个参数”。

因此,它等价于
addNat(Succ n)Zero=Succ n
?@wrek它在语义上是等价的,尽管GHC和其他编译器可能会对该代码执行一些稍微不同的操作。具体来说,使用
addNat n@(Succ)Zero=n
,GHC不会分配新的
Nat
,而使用
addNat(Succ n)Zero=Succ n
,GHC可能(尤其是在低优化级别)破坏第一个参数,并构造一个与旧参数具有相同含义的新的
Nat
,它等价于
addNat(Succ n)Zero=Succ n
?@wrek它在语义上是等价的,尽管GHC和其他编译器可能会对该代码做一些稍微不同的事情。具体来说,使用
addNat n@(Succ)Zero=n
,GHC不会分配新的
Nat
,而使用
addNat(Succ n)Zero=Succ n
,GHC可能(尤其是在低优化级别)破坏第一个参数,并构造一个与旧参数具有相同含义的新的
Nat