Haskell@运算符混淆
我对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 ->
添加零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
。