2013年11月4日月曜日

開発環境

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

その他参考書籍

6.5(練習問題)、1から4.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}

main :: IO ()
main = do
    putStrLn "1."
    mapM_ putStrLn $ map show booleans
    putStrLn "2."
    let a = True && False
        b = False && True
    putStrLn "どちらもFalse"
    putStrLn $ show a ++ ' ':show b
    putStrLn "3."
    putStrLn "a. 両方がTrueならTrue"
    mapM_ putStrLn $ map (\x -> show x ++ ' ':(show . bothTrue $ x)) boolPairs
    putStrLn "b. xがFalseならTrue"
    mapM_ putStrLn $ map (\x -> show x ++ ' ':(show . isX $ x)) boolPairs
    putStrLn "c. 少なくとも1つがTrue"
    mapM_ putStrLn $ map (\x -> show x ++ ' ':(show . anyPair $ x)) boolPairs
    putStrLn "4.排他的論理和"
    mapM_ putStrLn $ map (\x -> show x ++ ' ':(show . xor $ x)) boolPairs
    

booleans :: [(Bool, Bool)]
booleans = [(True && (not False), True),
            (True || True && False, True),
            ((not True) || (not False), True),
            ((52 :: Double) < 52.3, True),
            (1 + (52 :: Double) < 52.3, False),
            ((4 :: Double) /= 4.0, True)]

bothTrue :: (Bool, Bool) -> Bool
bothTrue (True, True) = True
bothTrue _ = False

isX :: (Bool, Bool) -> Bool
isX (False, _) = True
isX (_, _) = False

boolPairs :: [(Bool, Bool)]
boolPairs = [(a, b) | a <- [True, False], b <- [True, False]]

anyPair :: (Bool, Bool) -> Bool
anyPair (a, b) = any id [a, b]

xor :: (Bool, Bool) -> Bool
xor (True, False) = True
xor (False, True) = True
xor _ = False

入出力結果(Terminal, runghc)

$ runghc Sample.hs
1.
(True,True)
(True,True)
(True,True)
(True,True)
(False,False)
(False,True)
2.
どちらもFalse
False False
3.
a. 両方がTrueならTrue
(True,True) True
(True,False) False
(False,True) False
(False,False) False
b. xがFalseならTrue
(True,True) False
(True,False) False
(False,True) True
(False,False) True
c. 少なくとも1つがTrue
(True,True) True
(True,False) True
(False,True) True
(False,False) False
4.排他的論理和
(True,True) False
(True,False) True
(False,True) True
(False,False) False
$

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

0 コメント:

コメントを投稿