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
%