2013年11月7日木曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の6章(条件分岐)、6.5(練習問題)、8をHaskellで解いてみる。

その他参考書籍

6.5(練習問題)、8.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}

main :: IO ()
main = do
    mapM_ putStrLn $
          map (\a -> "人口: " ++ (show $ fst a) ++ "万人, " ++ "面積: " ++
                     (show $ snd a) ++ ", 人口密度: " ++
                     (show $ ppa (fst a) (snd a)) ++ "\na.\n" ++
                     (show $ funcA a) ++ "\nb.\n" ++
                     (show $ funcB a) ++ "\nc.\n" ++
                     (show $ funcC a) ++ "\nd.\n" ++
                     funcD a)
              populations

populations :: [(Double, Double)]
populations = [(500.0, 15 * 10 ** 4), (500.0, 5 * 10 ** 4),
               (1000.0, 15 * 10 ** 4), (1000.0, 5 * 10 ** 4),
               (3500.0, 15 * 10 ** 4), (3500.0, 5 * 10 ** 4),
               (5000.0, 15 * 10 ** 4), (5000.0, 5 * 10 ** 4)]

funcA :: (Double, Double) -> Maybe Double
funcA (x, _) | x <= 1000 = Just x
             | otherwise = Nothing

funcB :: (Double, Double) -> Maybe Double
funcB (x, _) | x >= 1000 && x <= 3500 = Just x
             | otherwise = Nothing

ppa :: Double -> Double -> Double
ppa a b = 10 ** 4 * a / b

funcC :: (Double, Double) -> Maybe String
funcC (x, y) | ppa x y > 100 = Just "過密"
             | otherwise = Nothing

funcD :: (Double, Double) -> String
funcD (x, y) = if ppa x y > 100 then
                   "過密"
               else
                   "過疎" 

入出力結果(Terminal, runghc)

$ runghc Sample.hs
人口: 500.0万人, 面積: 150000.0, 人口密度: 33.333333333333336
a.
Just 500.0
b.
Nothing
c.
Nothing
d.
過疎
人口: 500.0万人, 面積: 50000.0, 人口密度: 100.0
a.
Just 500.0
b.
Nothing
c.
Nothing
d.
過疎
人口: 1000.0万人, 面積: 150000.0, 人口密度: 66.66666666666667
a.
Just 1000.0
b.
Just 1000.0
c.
Nothing
d.
過疎
人口: 1000.0万人, 面積: 50000.0, 人口密度: 200.0
a.
Just 1000.0
b.
Just 1000.0
c.
Just "\36942\23494"
d.
過密
人口: 3500.0万人, 面積: 150000.0, 人口密度: 233.33333333333334
a.
Nothing
b.
Just 3500.0
c.
Just "\36942\23494"
d.
過密
人口: 3500.0万人, 面積: 50000.0, 人口密度: 700.0
a.
Nothing
b.
Just 3500.0
c.
Just "\36942\23494"
d.
過密
人口: 5000.0万人, 面積: 150000.0, 人口密度: 333.3333333333333
a.
Nothing
b.
Nothing
c.
Just "\36942\23494"
d.
過密
人口: 5000.0万人, 面積: 50000.0, 人口密度: 1000.0
a.
Nothing
b.
Nothing
c.
Just "\36942\23494"
d.
過密
$

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

0 コメント:

コメントを投稿