代数的データ型その10
再帰的な型です。
data Stack a = Empty | Push a (Stack a)
上記のように自分自身を型の宣言に使えます。と言うわけで本に書いてあった例を基にして、サンプルを作ってみました。
data Stack a = Empty | Push a (Stack a) isEmpty :: Stack a -> Bool isEmpty Empty = True isEmpty (Push _ _) = False top :: Stack a -> a top (Push x _) = x pop :: Stack a -> Stack a pop (Push _ stk) = stk stk1 = Empty stk2 = Push 1 (Empty) stk3 = Push 2 (Push 1 (Empty)) main = do print $ isEmpty stk1 -- True print $ isEmpty stk2 -- False print $ isEmpty stk3 -- False print $ top stk2 -- 1 print $ top stk3 -- 2 print $ top $ pop stk3 -- 1 print $ isEmpty $ pop stk3 -- False print $ isEmpty $ pop $ pop stk3 -- True
popしてもスタックの中身が変わらないというは違和感があります。