Comment detail
九九の表示 (Nested Flatten)nobsun関数型脳に侵されていますね :-) lazy脳というべきか。 do-ecを使うとループの中で直接副作用を起こすことができます。 Haskellerにとってはcomposableでないのが気持ち悪いでしょうが… あと、formatは直接幅指定ができます。 ~2d で2桁。 ~vd と書くと幅自体を引数で渡すこともできます (displayNN参照)
1 2 3 4 5 6 7 8 9 10 11 12 | (use srfi-42)
(define (display99 n)
(do-ec (: x 1 (+ n 1)) (: y 1 (+ n 1))
(format #t "~d * ~d = ~2d~%" x y (* x y))))
;; n >= 10 にも対応
(define (displayNN n)
(let ((w0 (string-length (number->string n)))
(w1 (string-length (number->string (* n n)))))
(do-ec (: x 1 (+ n 1)) (: y 1 (+ n 1))
(format #t "~vd * ~vd = ~vd~%" w0 x w0 y w1 (* x y)))))
|
> nobsun関数型脳に侵されていますね :-) lazy脳というべきか。 バレてる :) > ~vd と書くと幅自体を引数で渡すこともできます これもありそうだなと投稿してから気づいたのでした。 というわけでScheme版をHaskell版へ逆輸入
1 2 3 4 5 6 7 8 9 10 11 12 13 | import Text.Printf
displayNN n
= sequence_
$ do { i <- s
; j <- s
; return $ putStrLn $ printf fmt i j (i*j)
}
where
s = [1..n]
k = length $ show n
k' = length $ show (n*n)
fmt = printf "%%%dd * %%%dd = %%%dd" k k k'
|
Text.Printf.printf でも * フラッグが使えるのでした。
1 2 3 4 5 6 7 8 9 10 | import Text.Printf
displayNN :: Int -> IO ()
displayNN n
= sequence_
$ do { i <- [1..n] ; j <- [1..n]
; return $ putStrLn $ printf "%*d * %*d = %*d" k i k j k' (i*j)
}
where k = length $ show n
k' = length $ show (n*n)
|





nobsun
#3100()
[
Scheme
]
Rating2/2=1.00
Rating2/2=1.00-0+
1 reply [ reply ]