2013年11月2日土曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の5章(リスト)、5.13(練習問題)、1から13をHaskellで解いてみる。

その他参考書籍

4.8(練習問題)、3.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}

import qualified Data.List as List

main :: IO ()
main = do
    putStrLn "1."
    putStrLn $ show alkalineEartnMetals
    putStrLn "2."
    putStrLn $ "ラジウムの原子番号" ++ (show $ alkalineEartnMetals !! 5) ++
               " " ++ (show $ last alkalineEartnMetals)
    putStrLn "3.リストの要素数はlength関数で取得"
    putStrLn $ show $ length alkalineEartnMetals
    putStrLn "4.リストの最大値を取得するmax関数"
    putStrLn $ show $ List.maximum alkalineEartnMetals
    putStrLn "5. putStrとputStrLnの違い"
    putStr "a"
    putStrLn "a"
    putStrLn "6. リストに含まれる全ての値を1行に1つずつ表示"
    putStrLn $ "リスト: " ++ show halfLives
    mapM_ putStrLn $ map show halfLives
    putStrLn "7. リストに含まれる全ての値を同じ行に表示"
    mapM_ putStr $ map ((++" ") . show) halfLives
    putStrLn ""
    putStrLn "8. リストの要素の値の合計(sum)"
    putStrLn $ "自作sum: " ++ (show $ mySum countryPopulations)
    putStrLn $ "sum    : " ++ (show $ sum countryPopulations)
    putStrLn "9. 摂氏の気温のリスト"
    putStrLn $ show temps
    putStrLn "10. 数値のリストをソート"
    putStrLn $ show sortedTemps
    putStrLn "11."
    mapM_ putStrLn $ map show [coolTemps, warmTemps]
    putStrLn "12. 摂氏"
    putStrLn $ show tempsInCelsius
    putStrLn "13. 華氏に変換"
    putStrLn $ show tempsInFahrenheit

alkalineEartnMetals :: [Int]
alkalineEartnMetals = [4, 12, 20, 38, 56, 88]

halfLives :: [Double]
halfLives = [87.74, 24110.0, 6537.0, 14.4, 376000.0]

countryPopulations :: [Int]
countryPopulations = [1295, 23, 7, 3, 47, 21]

mySum :: [Int] -> Int
mySum = foldr1 (+)

temps :: [Double]
temps = [25.2, 16.8, 31.4, 23.9, 28.0, 22.5, 19.6]

sortedTemps :: [Double]
sortedTemps = List.sort temps

coolTemps :: [Double]
coolTemps = takeWhile (\x -> if x < 20 then True else False) sortedTemps

warmTemps :: [Double]
warmTemps = drop (length coolTemps) sortedTemps

tempsInCelsius :: [Double]
tempsInCelsius = coolTemps ++ warmTemps

tempsInFahrenheit :: [Double]
tempsInFahrenheit = map (\x -> x * 9 / 5 + 32) tempsInCelsius

入出力結果(Terminal, runghc)

$ runghc Sample.hs
1.
[4,12,20,38,56,88]
2.
ラジウムの原子番号88 88
3.リストの要素数はlength関数で取得
6
4.リストの最大値を取得するData.Listモジュールのmaximum関数
88
5. putStrとputStrLnの違い
aa
6. リストに含まれる全ての値を1行に1つずつ表示
リスト: [87.74,24110.0,6537.0,14.4,376000.0]
87.74
24110.0
6537.0
14.4
376000.0
7. リストに含まれる全ての値を同じ行に表示
87.74 24110.0 6537.0 14.4 376000.0 
8. リストの要素の値の合計(sum)
自作sum: 1396
sum    : 1396
9. 摂氏の気温のリスト
[25.2,16.8,31.4,23.9,28.0,22.5,19.6]
10. 数値のリストをソート
[16.8,19.6,22.5,23.9,25.2,28.0,31.4]
11.
[16.8,19.6]
[22.5,23.9,25.2,28.0,31.4]
12. 摂氏
[16.8,19.6,22.5,23.9,25.2,28.0,31.4]
13. 華氏に変換
[62.24,67.28,72.5,75.02,77.36,82.4,88.52]
$

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

0 コメント:

コメントを投稿