Hatena::Groupsicp

yharaの日記

参考リンク
 | 

2007-05-03

[].4 16:03

((if (> b 0) + -) a b) みたいに書ける、という話。+ - なんての書いたことはないけど、

確かに動くなぁ。

これが「関数ファーストクラス」の力だ。

Haskellでも似たような書き方ができるね。

(if b>0 then (+) else (-)) a b

Rubyだと関数そのものはファーストクラスではないのでcallをつける必要がある。

(if b>0 
  proc{|a,b| a+b}
 else
  proc{|a,b| a-b}
 end).call(a, b)

あとHaskellの(+)みたいな書き方はできない。

いや、Object#methodでメソッドを取り出すことはできるんだけど、

RubyのInteger#+は1引数なんでうまく行かない(0.method(:+)のように、+の片側が固定

されてしまう)。

ちょっと違うやり方になるけど、__send__を使う方がRubyらしいかもな。

a.__send__(if b>0 then :+ else :- end, b)

ChristianaChristiana2012/01/10 09:33That's more than snebsile! That's a great post!

sgiodkkfjgssgiodkkfjgs2012/01/10 19:14Gv8tkW <a href="http://cjqpfjauqswr.com/">cjqpfjauqswr</a>

ntfhyvcwntfhyvcw2012/01/12 22:54TKFix7 <a href="http://egvshzpudncy.com/">egvshzpudncy</a>

 |