2017-05-07 90 views
0
data Nat = Zero | Succ Nat 
     deriving (Eq, Show) 

-- Add two Natural number 
addNat :: Nat -> Nat -> Nat 
addNat Zero Zero   = Zero 
addNat Zero [email protected](Succ _) = n 
addNat [email protected](Succ _) Zero = n 
addNat (Succ x) (Succ y) = Succ (Succ (addNat x y)) 

我對Haskell函數中的@運算符感到迷惑。Haskell @運算符混淆

我想知道addNat Zero [email protected](Succ _) = n是什麼意思?

是不是表示addNat Zero Succ b = Succ b

回答

2

name如果是變量名,和pat是一個圖案,然後[email protected]是一個匹配什麼時候pat做圖案,並且也結合到name匹配pat的值。所以:

addNat [email protected](Succ _) Zero = n 

說:「如果第一個參數是Succ,第二個是一個Zero,然後返回第一個參數」。

+0

所以,它相當於'addNat(Succ n)Zero = Succ n'? – wrek

+1

@wrek儘管GHC和其他編譯器可能會做一些與該代碼稍有不同的東西,但它在語義上是等效的。具體來說,使用'addNat n(Succ _)Zero = n',GHC將不會分配新的'Nat',而對於'addNat(Succ n)Zero = Succ n',GHC可能(特別是在低優化級別)破壞第一個參數,並構建一個與舊的意義相同的* new *'Nat'。 –