Skip to content

Instantly share code, notes, and snippets.

@plaster
Created December 9, 2012 16:18
Show Gist options
  • Save plaster/4245866 to your computer and use it in GitHub Desktop.
Save plaster/4245866 to your computer and use it in GitHub Desktop.
Problem 1
(use 'clojure.set)
(defn n-multiples [n end] (set (range 0 end n)))
(defn solve []
(apply + (union (n-multiples 3 1000)
(n-multiples 5 1000))))
@kohyama
Copy link

kohyama commented Dec 10, 2012

数値のシーケンスの総和に関しては

(reduce + '(1 2 3 4 5)) ; -> (+ (+ (+ (+ 1 2) 3) 4) 5)
(apply + '(1 2 3 4 5)) ; -> (+ 1 2 3 4 5)

なので, clojure の + がもし二引数関数なら reduce 一択なんですが, そもそも + 自体が可変長引数を受け入れる力があるので, 可変長の要素に対する対応を reduce で強制するのではなく, + が持っている機能 (たとえそれが内部的に reduce と等価だとしても) を使って上げる方が, より高い方の抽象化を使っていることになっていいんじゃないか. というのが私の考えです.

ま, おっしゃっているように, で結局 + もしくは apply の動作は自分の好み(遅延性があるかとか)にあっているか? というのも一つの尺度ですよね. 参考になります.

@tnoda
Copy link

tnoda commented Dec 11, 2012

@kohyama のコメントを見る前だったので,なんだか同じようなことも書いていますが,私は (apply + coll) 派ですね. > http://tnoda-clojure.tumblr.com/post/37700304493/apply-and-reduce (@ponkore 版解答のコメントに貼ったのと同じ URL)

@tnoda
Copy link

tnoda commented Dec 11, 2012

@plaster https://gist.github.com/4245866#gistcomment-621381apply/my-* 実験分かりやすくて参考になりました.apply に渡す関数の作り方の勉強にもなりました.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment