-- <$>とか使う場合は必須。でも、7.10からはデフォルトで読み込まれるので不要。 import Control.Applicative -- main、ここでIOモナドを完結させる。 main :: IO () -- do記法を使う。別に他の方法でもいいけど、読み込む物が多くなった場合は、 -- こっちの方がわかりやすいと思う。たぶん。 main = do -- ---- -- 1行読み込んで、空白切りで配列に分割して、それぞれを数字に変換する。 -- readで変換される型は、main'での型指定によって決まる。 -- IO [a] ab <- map read . words <$> getLine -- ---- -- 単純に1行をStringとして読み込む。末尾改行は含まれない。 -- IO String s <- getLine -- ---- -- その他に、1行に数字一つだけであれば下記のようにする。 -- IO a -- n <- read <$> getLine -- ---- -- 読み込んだ値を別関数に渡して、戻り値を出力する。 -- 戻り値がIntの場合は、`print`を使う。 -- 戻り値がFloatの場合は、`Text.Printf.printf`を使う必要がある。 -- IO () putStrLn $ main' ab s -- 実際に問題を解く関数main'、実際の名前は何でもいい。 -- ここの型指定でmainでのreadが何に変換されるが決まる。 -- IOモナドは持ち込まずに純粋な関数だけの世界にすると書きやすいと思う。 main' :: [Int] -> String -> String main' ab s = (show . sum) ab ++ " " ++ s