開発環境
- OS X Lion - Apple(OS)
- Emacs、BBEdit - Bare Bones Software, Inc. (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
『初めてのプログラミング 第2版』(Chris Pine 著、長尾 高弘 訳、オライリー・ジャパン、2010年、ISBN978-4-87311-469-9)の13章(新しいクラスの作成と既存クラスの変更), 13.2(クラスの作り方)、13.3(インスタンス変数)、13.4(newとinitialize)、13.5(ベビードラゴンゲーム)、13.6(練習問題の続き)、オレンジの木をHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
Haskellだと組み込みクラスとかオブジェクトとかRubyと考え方が違うので、前問と同様にとりあえずモジュールを作ったり、自作の新しい型を作ったりしてみる。
型を作る。
コード(BBEdit)
Sample.hs
{-# OPTIONS -Wall -Werror #-} import OrangeTree main :: IO () main = do putStrLn "オレンジの木を植えました。" let ot = OrangeTree True 0 0 0 pass 11 ot pass :: Int -> OrangeTree -> IO () pass a b = do if a == 0 then return () else do putStrLn "1年経過しました。" let c = oneYearPasses b putStrLn $ orangeTreeState c let n = orangeCount c pick (n + 1) c pass (a - 1) c pick :: Int -> OrangeTree -> IO () pick a b = do if a == 0 then return () else do let c = pickAnOrange b putStrLn $ snd c pick (a - 1) $ fst c
コード(BBEdit)
OrangeTree.hs
{-- {-# OPTIONS -Wall -Werror #-} --} module OrangeTree ( OrangeTree (..), oneYearPasses, pickAnOrange, orangeTreeState, ) where data OrangeTree = OrangeTree {alive :: Bool, height :: Int, orangeCount :: Int, age :: Int} deriving (Show) oneYearPasses :: OrangeTree -> OrangeTree oneYearPasses (OrangeTree False _ _ _) = OrangeTree False 0 0 0 oneYearPasses (OrangeTree _ _ _ 10) = OrangeTree False 0 0 0 oneYearPasses (OrangeTree a b c d) | d < 4 = OrangeTree a (b + 1) c (d + 1) | otherwise = OrangeTree a (b + 1) (d - 3) (d + 1) pickAnOrange :: OrangeTree -> (OrangeTree, String) pickAnOrange (OrangeTree {alive = False}) = (OrangeTree {alive = False}, "木はもう枯れているので実は採れません。") pickAnOrange (OrangeTree a b c d) | d < 5 = (OrangeTree a b c d, "まだ樹齢" ++ (show d) ++ "なので採れる実はありません。") | c > 0 = (OrangeTree a b (c - 1) d, "とてもおいしいオレンジの実が採れました。") | otherwise = (OrangeTree a b c d, "今年はもう採れる実がありません。") orangeTreeState :: OrangeTree -> String orangeTreeState a = "高さ: " ++ (show $ height a) ++ " 実の数: " ++ (show $ orangeCount a)
入出力結果(Terminal, runghc)
$ runghc Sample.hs OrangeTree.hs:26:6: Warning: Fields of `OrangeTree' not initialised: height, orangeCount, age In the expression: OrangeTree {alive = False} In the expression: (OrangeTree {alive = False}, "\26408\12399\12418\12358\26543\12428\12390\12356\12427\12398\12391\23455\12399\25505\12428\12414\12379\12435\12290") In an equation for `pickAnOrange': pickAnOrange (OrangeTree {alive = False}) = (OrangeTree {alive = False}, "\26408\12399\12418\12358\26543\12428\12390\12356\12427\12398\12391\23455\12399\25505\12428\12414\12379\12435\12290") オレンジの木を植えました。 1年経過しました。 高さ: 1 実の数: 0 まだ樹齢1なので採れる実はありません。 1年経過しました。 高さ: 2 実の数: 0 まだ樹齢2なので採れる実はありません。 1年経過しました。 高さ: 3 実の数: 0 まだ樹齢3なので採れる実はありません。 1年経過しました。 高さ: 4 実の数: 0 まだ樹齢4なので採れる実はありません。 1年経過しました。 高さ: 5 実の数: 1 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 6 実の数: 2 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 7 実の数: 3 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 8 実の数: 4 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 9 実の数: 5 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 10 実の数: 6 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 とてもおいしいオレンジの実が採れました。 今年はもう採れる実がありません。 1年経過しました。 高さ: 0 実の数: 0 木はもう枯れているので実は採れません。 $
0 コメント:
コメントを投稿