2013年11月23日土曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)の12章(高度な型)、12.1(構造体)、12.2(共用体)、12.3(typedef)、12.4(enum型)、12.5(キャスト)、12.6(ビットフィールドまたは構造体の圧縮)、12.7(構造体配列)、12.9(プログラミング実習)、実習12-4をHaskellで解いてみる。

その他参考書籍

実習12-4.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}

main :: IO ()
main = do
    putStrLn "出発空港のコードを入力"
    s <- getLine
    putStrLn "便のリスト"
    mapM_ print $ ticketsFrom s tickets

ticket :: Ticket
ticket = Ticket "abcde12345" "fgh" "ijk" (Time 10 20) (Time 14 30)

data Ticket = Ticket {flight :: String, from :: String, to :: String,
                      start :: Time, arrive :: Time}
              deriving (Eq)

instance Show Ticket where
    show t = "便名: " ++ flight t ++ '\n':"出発空港コード: " ++ from t ++
        '\n':"到着空港コード: " ++ to t ++ '\n':"出発時間: " ++ (show $ start t) ++
        '\n':"到着時間: " ++ (show $ arrive t)

data Time = Time {hour :: Int, minute :: Int} deriving (Eq)

instance Show Time where
    show t = (show $ hour t) ++ "時" ++ (show $ minute t) ++ "分"

tickets :: [Ticket]
tickets = [Ticket "a" "abc" "def" (Time 10 20) (Time 14 30),
           Ticket "b" "def" "abc" (Time 10 20) (Time 14 30),
           Ticket "c" "abc" "ijk" (Time 11 20) (Time 15 30),
           Ticket "d" "abc" "ijk" (Time 12 20) (Time 16 30),
           Ticket "e" "fgh" "abc" (Time 11 20) (Time 15 30),
           Ticket "f" "fgh" "abc" (Time 12 20) (Time 16 30),
           Ticket "g" "abc" "ijk" (Time 12 20) (Time 16 30),
           Ticket "g" "abc" "ijk" (Time 13 20) (Time 17 30),
           Ticket "i" "abc" "ijk" (Time 14 20) (Time 18 30),
           Ticket "j" "fgh" "abc" (Time 12 20) (Time 16 30)]

ticketsFrom :: String -> [Ticket] -> [Ticket]
ticketsFrom s = filter ((s==) . from)

入出力結果(Terminal, runghc)

$ runghc Sample.hs
出発空港のコードを入力
abc
便のリスト
便名: a
出発空港コード: abc
到着空港コード: def
出発時間: 10時20分
到着時間: 14時30分
便名: c
出発空港コード: abc
到着空港コード: ijk
出発時間: 11時20分
到着時間: 15時30分
便名: d
出発空港コード: abc
到着空港コード: ijk
出発時間: 12時20分
到着時間: 16時30分
便名: g
出発空港コード: abc
到着空港コード: ijk
出発時間: 12時20分
到着時間: 16時30分
便名: g
出発空港コード: abc
到着空港コード: ijk
出発時間: 13時20分
到着時間: 17時30分
便名: i
出発空港コード: abc
到着空港コード: ijk
出発時間: 14時20分
到着時間: 18時30分
$

{-# OPTIONS -Wall -Werror #-}を記述してるから、細かく型を指定(:: Double)しないと警告がいっぱい出た。慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿