計算機科学のブログ

HaskellのI/O コマンドラインの操作と遅延I/O 遅延評価をしない方法、mapMとmapM_、mapMによるreplicateMの実装、Monad

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

コード

main :: IO ()
main = do
    vs <- mapM (\_ -> getLine) [1..3]
    mapM_ print vs

入出力結果(Terminal, Zsh)

% ghc sample01.hs 
[1 of 1] Compiling Main             ( sample01.hs, sample01.o )
Linking sample01 ...
kamimura@MacBook lesson22 % ./sample01 
1
a
haskell
"1"
"a"
"haskell"
%

コード

import System.Environment

myReplicateM :: (Monad m, Num a, Enum a) => a -> m b -> m [b]
myReplicateM n func = mapM (\_ -> func) [1..n]

main :: IO ()
main = do
    args <- getArgs
    let linesToRead = if length args > 0
                      then read (head args)
                      else 0 :: Int
    numbers <- myReplicateM linesToRead getLine 
    let ints = map read numbers :: [Int]
    print (sum ints)

入出力結果(Terminal, Zsh)

% ghc sample02.hs 
[1 of 1] Compiling Main             ( sample02.hs, sample02.o )
Linking sample02 ...
% ./sample02
0
% ./sample02 2
4
59
63
% ./sample02
0
% ./sample02 4
1
2
3
410
416
%