計算機科学のブログ

HaskellのI/O - コマンドラインの操作と遅延I/O - 遅延評価を使用しない方法 - replicateMの独自の実装, mapM

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT4(HaskellのI/O)、LESSON 22(コマンドラインの操作と遅延I/O)、22.1(コマンドラインの操作:遅延評価を使用しない方法)、クイックチェック 22-2の解答を求めてみる。

コード

sample2.hs

import System.Environment
main :: IO ()
main = do
  args <- getArgs
  let linesToRead =
        if not (null args)
          then read (head args)
          else 0
  numbers <- myReplicateM linesToRead getLine
  let ints = map read numbers
  print $ sum ints


myReplicateM :: (Monad m) => Int -> m a -> m [a] 
myReplicateM n func = mapM (\_ -> func) [1 .. n]

入出力結果(Terminal, Zsh)

% runghc sample2.hs 2
4
59
63
% runghc sample2.hs 4
1
2
3
410
416
%