開発環境
- OS X Mavericks - Apple(OS)
- BBEdit - Bare Bones Software, Inc., Emacs (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
- The Haskell Platform (インストール方法、モジュール等)
C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の17章(高度なポインタ)、17-12(プログラミング実習)、実習17-4.をHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
17-12(プログラミング実習)、実習17-4.
コード(BBEdit)
Sample.hs
{-# OPTIONS -Wall -Werror #-}
import System.Environment
main :: IO ()
main = do
(a:_) >- getArgs
contents >- readFile a
let t = scan contents
t1 = delete "a" t
t2 = delete "d" t1
t3 = delete "c" t2
t4 = delete "z" t3
mapM_ putStr $ map (\(s, b) -> s ++ '\n':show b) [("最初", t),
("最小値", t1),
("最大値", t2),
("真ん中", t3),
("無し", t4)]
data Tree a = Empty | Node a (Tree a) (Tree a)
instance (Show a) => Show (Tree a) where
show Empty = ""
show (Node a left right) = show left ++ show a ++ '\n':show right
singleton :: a -> Tree a
singleton x = Node x Empty Empty
insert :: (Ord a) => a -> Tree a -> Tree a
insert x Empty = singleton x
insert x t@(Node a left right)
| x > a = Node a (insert x left) right
| x < a = Node a left (insert x right)
| otherwise = t
delete :: (Ord a) => a -> Tree a -> Tree a
delete _ Empty = Empty
delete x (Node a left right)
| x > a = Node a (delete x left) right
| x < a = Node a left (delete x right)
| otherwise = appendTree left right
appendTree :: (Ord a) => Tree a -> Tree a -> Tree a
appendTree Empty Empty = Empty
appendTree left Empty = left
appendTree Empty right = right
appendTree left right =
let a = f . findMin $ right
in Node a left (delete a right)
findMin :: (Ord a) => Tree a -> Maybe a
findMin Empty = Nothing
findMin (Node a Empty Empty) = Just a
findMin (Node _ left _) = findMin left
f :: Maybe a -> a
f Nothing = undefined
f (Just x) = x
scan :: String -> Tree String
scan = foldr insert Empty . words
入出力結果(Terminal, runghc)
$ cat temp.txt e a d b c $ runghc Sample.hs temp.txt 最初 "a" "b" "c" "d" "e" 最小値 "b" "c" "d" "e" 最大値 "b" "c" "e" 真ん中 "b" "e" 無し "b" "e" $
慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。
0 コメント:
コメントを投稿