Created
December 9, 2012 16:18
-
-
Save plaster/4245866 to your computer and use it in GitHub Desktop.
Problem 1
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)))) |
数値のシーケンスの総和に関しては
(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
の動作は自分の好み(遅延性があるかとか)にあっているか? というのも一つの尺度ですよね. 参考になります.
@kohyama のコメントを見る前だったので,なんだか同じようなことも書いていますが,私は (apply + coll)
派ですね. > http://tnoda-clojure.tumblr.com/post/37700304493/apply-and-reduce (@ponkore 版解答のコメントに貼ったのと同じ URL)
@plaster https://gist.github.com/4245866#gistcomment-621381 の apply
/my-*
実験分かりやすくて参考になりました.apply
に渡す関数の作り方の勉強にもなりました.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
おお、本当にいらないですね
seq
。修正しました。ありがとうございます。そういえば、
apply
とreduce
の件で気になってることがあったのでした。私の感覚だと、apply
=> 要素ぜんぶ評価して渡すreduce
=> 都度シーケンスから取り出して畳み込むだったので、どっちも使える状況なら
reduce
のほうがいいのでは?と思っていたのです。でも、どうも試してみた感じ、
apply
のときにもちゃんと遅延してるようにみえます。だとすると、最終的には必ず全部シーケンスから取り出してしまうのが確定な
reduce
よりも、関数の中で引数使うかどうか選べる
apply
のほうがいいのかもしれないですね。