wvogel日記

自分用の技術備忘録が多めです.

Stack

HaskellでStackを書いてみた。
リストの処理をすればいいだけなんですけどね。
代数的データ型の扱いに慣れようと思って

data Stack a = Empty | Value a (Stack a) deriving Show

fstack :: Stack String -> String -> Stack String
fstack stack str = case str of
    "pop" -> pop stack
    otherwise -> push stack str

push :: Stack a -> a -> Stack a
push stack str = case stack of
    Empty -> Value str Empty
    Value value next -> Value value $ push next str

pop :: Stack a-> Stack a
pop stack = case stack of
    Value value Empty -> Empty
    Value value next -> Value value $ pop next

main=getContents >>= (\x -> print $ foldl fstack Empty $ words x)

微妙に、main関数内で、無名関数を介したモナドも使ってみる。
モナドをもっと使いこなしたい

popやpushとまったく同様にしてQueueも記述できますね。
簡単に書けたのでよしとする。
push,pop関数自体は、Stack内の型を指定しないので使いまわせるけれど。
普通に使うとなったらリストで充分なのが寂しい笑
実効速度から言っても、そちらの方が早いです。

一応二分木も書いたしな。
ハッシュとか?
あ、リストと代数的データ型の組み合わせとかもやってみるか