Comment detail

九九の表示 (Nested Flatten)
Gauche
srfi-42とutil.matchを使った
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(use srfi-42)
(use util.match)

(define (display99 n)
  (let* ((k (string-length (x->string n)))
         (k2 (string-length (x->string (* n n))))
         (fmt (string-append "~" (x->string k) "d * ~" (x->string k) "d = ~" (x->string k2) "d~%")))
    (define (f x)
      (match x
        ((i j ij) (format #t fmt i j ij))))
    (for-each f (list-ec (: x 1 (+ n 1)) (: y 1 (+ n 1)) (list x y (* x y))))
    (values)))
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)

Index

Feed

Other

Link

Pathtraq

loading...