reduce(r|l)
というわけで問題。reducelとreducerを実装せよ。制限時間はあわせて10分。ただし、reducelとreducerは、Haskellにおいて次の挙動を示すものとする。
*Main> reducel (\x y -> "("++x++"#"++y++")") $ map show [1..4] "(((1#2)#3)#4)" *Main> reducer (\x y -> "("++x++"#"++y++")") $ map show [1..4] "(1#(2#(3#4)))"
fold使ったらトイレ行ったりしつつ10分くらいでできたけど、foldってsrfi-1なのね。srfi-1にはreduceがあるから、fold使うのはおかしい
R5RSの関数だけで書きなおした。
(define (reducer kons ls) (if (< (length ls) 2) (car ls) (kons (car ls) (reducer kons (cdr ls))))) (define (reducel kons ls) (let ((ls (reverse ls))) (letrec ((iter (lambda (kons ls) (if (< (length ls) 2) (car ls) (kons (iter kons (cdr ls)) (car ls)))))) (iter kons ls))))