2013年11月13日水曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の7章(反復)、7.7(練習問題)、2をHaskellで解いてみる。

その他参考書籍

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 コメント:

コメントを投稿