我已經通過了LYAH,但我覺得這不是一個很好的介紹給Haskell。我遇到了「對Haskell的一個溫和的介紹」,它推薦Richard Bird的「使用Haskell進行函數式編程入門」。這是我正在閱讀的書。第3章給出了一個數據類型Nat,並用它實現了基本的算術。從零開始實施自然數算術的難題
這是代碼我寫直到如今
module Main where
import Prelude hiding ((^^))
data Nat = Zero | Succ Nat
deriving (Eq, Ord, Show)
xx :: Nat -> Nat -> Nat
m `xx` Zero = Zero
m `xx` Succ n = (m `xx` n) `add` m
(^^) :: Nat -> Nat -> Nat
m ^^ Zero = Succ Zero
m ^^ Succ n = (m ^^ n) `xx` m
add :: Nat -> Nat -> Nat
m `add` Zero = m
m `add` Succ n = Succ(m `add` n)
factsu :: Nat -> Nat
factsu Zero = Succ Zero
factsu (Succ n) = Succ n `xx` factsu n
--Zero = 0
showNat :: Nat -> String
showNat Zero = "Zero"
showNat (Succ Zero) = "Succ Zero"
showNat (Succ (Succ n)) = "Succ (" ++ showNat (Succ n) ++ ")"
main :: IO()
main = return()
這是發生了什麼:
factsu Zero
Succ Zero
it :: Nat
如何定義SUCC和零?
你用*定義'Succ'和'Zero' *是什麼意思?你在文件中定義了它們... –
@WillemVanOnsem我認爲它們被解釋爲字符串。 – learninghaskell
不,你將它們定義爲:'數據Nat = Zero | Succ Nat'。因爲'Nat'是從'Show'派生的,所以你可以用'show(Succ Nat)'將它們轉換爲一個字符串。你也可以從'Read'派生出來,這樣你就可以將''Succ Zero''分析成'Succ Zero'。 –