これは圏です(はてな使ったら負けだとおもっていた)

きっと何者にもなれないつぎの読者につづく。

require 'haskell'

Haskeller にして Rubyist のみなさん今晩は!

最近は勉強の隙を見付けては rupircdを弄っている日々です。

今日はコマンドの処理を IRCServer#recv_message で一括してやっていたのを on_privmsg とか on_notice とかで分業させることでコマンド拡張をし易くしたのですが。

この時にこんなコードを書いてエラーになってしまったのです!

msg = Message.parse(line)
params = msg.params
@used[msg.command.upcase][0] += 1
mtd = "on_" ++ msg.command.downcase
if respond_to?(mtd)
  __send__(mtd, user, params)
else
  raise UnknownCommand.new(msg.command)
end

どこが間違っているか判りますか?わかりませんよね?わかるはずがありません!
二,三十分迷った結果、ついに修正すべき箇所がわかりました*1。それは……

mtd = "on_" ++ msg.command.downcase

ここです!え!?なんで!?

……そう。正しくは

mtd = "on_" + msg.command.downcase

であるべきだったのです!

なんで!連結と云えば ++ でしょう!Has考*2……
Rubyクラスがどうとかポリモーフィズムがどうとかいうことで、合体系は全部 "+" にしてるのです!こんな横暴をゆるしていいのでしょうか?否!連結は ++ であるべきです、++でなくてはならない!!


Rubyのヒアドキュメントで定義した函数Haskell評価してくれる、yhara さんの rubiskellと云う素敵なライブラリもありますが、私は ++ だけを愛しているので、他の要素は要りません。そして愛していると居っても態々ヒアドキュメントに書く程愛している訳でもありません。と云うか、愛しているのでヒアドキュメントにしなくても書けなきゃいやです!!


と云うことで、愛と正義の為に、ruby-haskell というライブラリを作りました。無駄にgithubです。それは愛だから。あとid:hajimehoshi が require "php" を github で公開しているのでそれに倣いました。

使い方は簡単。

  p [1, 2, 3]  # => [1, 2, 3]
  p [1, 2, 3] ++ [2, 3, 4]   # => Error!
  require "haskell"
  p [1, 2, 3] ++ [2, 3, 4]   # => [1,2,3,2,3,4]
  p "hogehoge" ++ "fugafuga" # => "hogehogefugafuga"

やった ++ つかえてるよ・・・!!!すばらしい!!!

あと今思い付いたのですが、 "ruby-haskell" と書いて "ruby ++ haskell"と読んでください。でんこちゃんからのお願いです!

*1:エラーログ読んだら負けだと思っている

*2:Haskell的に考えての略