第4回 スタートHaskell2に参加してきました
第4回 スタートHaskell2 - [PARTAKE] に参加してきました。
- 第8章「入出力」@igrep さん
- IO action
- putStrLn は文字列を引数にとり、()(空のタプル。unit型ともいう)を結果とする I/O アクションを返す
- do記法。IO actionをつなぎ合わせる。
- >>= 関数の構文糖らしい main = getLine >>= print
- when b f = bがTrueの時だけfを実行
- forever
- 第9章「もっと入力、もっと出力」 @mizu_tama さん
- ファイル操作。自由度の高い方から openFile, withFile, (readFile, writeFile, appendFile)
- System.Randomモジュール
- getStdGen
- newStdGen
- bytestring, Stringより効率よく文字列を扱う
- LT 「Haskell Golfへのおさそい」@notogawa さん
- golfしか出来なくなる危険性…。
- Haskell Golf 入門 - ぼくのぬまち 出張版
練習問題
練習問題は、エコーと九九の表だけやりました。
練習問題: エコー
ユーザーの入力をそのまま表示するプログラムを作ろう。
ただし “quit” と入力されたときは “Do you really want to quit? (yes/no)” と表示して、次の入力が “yes” だったらプログラムを終了する。
文字出力の際、バッファリングの関係ですぐに表示されないことがある。そのときは hFlushを使うとよい。
import Control.Monad import System.IO (hFlush, stdout) main = do x <- getLine if x == "quit" then do putStrLn "Do you really want to quit? (yes/no)" hFlush stdout y <- getLine when (y /= "yes") $ do main else do putStrLn x hFlush stdout main
練習問題: 九九の表
こんな感じの九九の表を表示してみよう。
1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81
Text.Printfモジュールを使うと、いわゆるprintf関数がつかえるようです。printfは IO として扱われると、文字列を出力し、Stringとして扱われるとStringを返すようです。素晴らしいですね! 参考: Text.Printf.printf を使ってみる - sirocco の書いてもすぐに忘れるメモ
import Text.Printf qq :: [[Int]] qq = [map (*i) [1..9] | i <- [1..9]] format :: Int -> String format n = printf "%3d" n formatList :: [Int] -> String formatList xs = unwords $ map format xs main :: IO () main = mapM_ putStrLn $ map formatList qq