LoginSignup
6
1

More than 5 years have passed since last update.

Haskell で標準入力(メモ)

Last updated at Posted at 2017-11-28

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つを駆使して書きまくってもっと理解を深めていきます。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1