開発環境
- OS X Mavericks - Apple(OS)
- BBEdit - Bare Bones Software, Inc., Emacs (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
- The Haskell Platform (インストール方法、モジュール等)
初めてのコンピュータサイエンス(Jennifer Campbell、Paul Gries、Jason Montojo、Greg Wilson(著)長尾 高弘(翻訳))の7章(反復)、7.7(練習問題)、2をHaskellで解いてみる。
その他参考書籍
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
- Real World Haskell―実戦で学ぶ関数型言語プログラミング (オライリージャパン) Bryan O'Sullivan John Goerzen Don Stewart(著) 山下 伸夫 伊東 勝利 株式会社タイムインターメディア(翻訳)
7.7(練習問題)、2.
コード(BBEdit)
Sample.hs
{-# OPTIONS -Wall -Werror #-} import System.Random main :: IO () main = do gen1 <- getStdGen gen2 <- newStdGen let rat1 = makeRats gen1 rat2 = makeRats gen2 mapM_ print [rat1, rat2] mapM_ putStrLn $ ["a: " ++ a rat1 rat2, "b: " ++ b rat1 rat2, "c: " ++ c rat1 rat2] type Rats = [Int] makeRats :: StdGen -> Rats makeRats = (take 10) . randomRs (1, 10) compareWeight :: Int -> Rats -> Rats -> Bool compareWeight n r1 r2 = if r1 !! (n - 1) > r2 !! (n - 1) then True else False a :: Rats -> Rats -> String a r1 r2 = if compareWeight 1 r1 r2 then "Rat 1 weighed more thnn Rat 2 on Day 1." else "Rat 1 weighed less than Rat 2 on Day 1." b :: Rats -> Rats -> String b r1 r2 = if compareWeight 1 r1 r2 then if compareWeight 10 r1 r2 then "Rat 1 remained heavier than Rat 2." else "Rat 2 became heavier than Rat 1." else "" c :: Rats -> Rats -> String c r1 r2 | compareWeight 1 r1 r2 && compareWeight 10 r1 r2 = "Rat 1 remained heavier than Rat 2." | compareWeight 1 r1 r2 && not (compareWeight 10 r1 r2) = "Rat 2 became heavier than Rat 1." | otherwise = ""
入出力結果(Terminal, runghc)
$ ghc --make Sample [1 of 1] Compiling Main ( Sample.hs, Sample.o ) Linking Sample ... $ ./Sample [3,4,2,9,5,9,9,7,7,7] [1,8,3,5,2,9,4,10,4,1] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 1 remained heavier than Rat 2. c: Rat 1 remained heavier than Rat 2. $ ./Sample [8,8,6,5,5,6,10,4,7,2] [5,2,9,5,9,10,1,10,9,3] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 2 became heavier than Rat 1. c: Rat 2 became heavier than Rat 1. $ ./Sample [7,9,10,9,1,8,4,1,7,9] [6,6,3,1,1,4,8,10,6,1] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 1 remained heavier than Rat 2. c: Rat 1 remained heavier than Rat 2. $ ./Sample [9,5,7,8,5,1,9,5,10,9] [4,3,2,5,4,9,2,3,4,2] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 1 remained heavier than Rat 2. c: Rat 1 remained heavier than Rat 2. $ ./Sample [10,5,4,4,3,9,8,4,6,7] [2,10,8,1,2,8,1,9,2,8] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 2 became heavier than Rat 1. c: Rat 2 became heavier than Rat 1. $ ./Sample [8,7,4,2,7,2,2,10,6,5] [4,10,8,7,5,2,9,9,2,6] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 2 became heavier than Rat 1. c: Rat 2 became heavier than Rat 1. $ ./Sample [9,9,8,5,6,4,4,2,2,6] [8,4,9,6,5,4,1,5,3,7] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 2 became heavier than Rat 1. c: Rat 2 became heavier than Rat 1. $ ./Sample [2,10,8,2,9,4,10,7,6,10] [7,6,8,9,7,10,4,9,7,6] a: Rat 1 weighed less than Rat 2 on Day 1. b: c: $ ./Sample [1,2,9,9,6,5,5,10,3,7] [9,5,3,6,8,5,7,6,4,7] a: Rat 1 weighed less than Rat 2 on Day 1. b: c: $ ./Sample [6,4,7,6,8,1,6,4,5,8] [1,3,10,8,4,6,1,8,5,8] a: Rat 1 weighed more thnn Rat 2 on Day 1. b: Rat 2 became heavier than Rat 1. c: Rat 2 became heavier than Rat 1. $
{-# OPTIONS -Wall -Werror #-}を記述してるから、細かく型を指定(:: Double)しないと警告がいっぱい出た。慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。
0 コメント:
コメントを投稿