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)))"

404 Blog Not Found:Code Snippets - reduce(l|r)を実装汁!

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))))