Haskell で標準入力(メモ)
標準入力を使って遊ぶことが多いけど、始めたての頃は値の受け取りに苦労してなかなか本題に進まなかったので、今の自分の実力で書けるレベルの標準入力を列挙していく。
不正入力には対応していないので注意。
整数型半角スペース区切り
1 2 3 4 5 6
みたいな半角スペースの羅列を1行分受け取りたい。できれば何個の数字が入力されるかを知らない状態で入力を受け取りたい。
-- [Char]あるいは String を Int にする
toInt :: (String -> Int)
toInt x = read x ::Int
--入力を受け取り、[Int]にする
getInts = do
x <- getLine
let y = (map$toInt)$words x -- 半角スペースで分割してInt にする
return y
--使用例
main = do
x <- getInts -- < 1 2 3 4 5 6
print x -- > [1,2,3,4,5,6]
print$sum x -- > 21
少しいじれば float にできる
行列(数字)
半角スペース区切りの行列を[[Int]]の2次元リストに受け取る。
先ほどの関数も使います。途中、words の代わりにlinesを使うと短く書けるけど、型を指定して受け取っているので何行から何行までこのフォーマットで受け取る、みたいに書きたい。
getMat :: (Int -> IO [[Int]])
getMat 1 = do
y <- getInts
return [y]
getMat x = do
y <- getInts
z <- getMat (x-1)
let w = [y] ++ z
return w
--使用例
main = do
a <- getMat 3 -- < 1 2 3\n4 5 6\n7 8
print a -- > [[1,2,3],[4,5,6],[7,8]]
--先ほど作ったやつ
toInt :: (String -> Int);toInt x = read x ::Int;
getInts = do
x <- getLine;let z = (map$toInt)$words x
return z
短縮バージョン
getInts = do
x <- getLine
let y = (map$toInt)$words x
return y
where
toInt x = read x ::Int
getMat x
|x==1 = do
y <- getInts
return [y]
|otherwise = do
y <- getInts
z <- getMat (x-1)
let w = [y] ++ z
return w
とりあえず、この2つを駆使して書きまくってもっと理解を深めていきます。