List comprehensionsとrubyのeach

in

すっかり堅くなった頭をほぐしながらですが、Haskell勉強中です。

今日、リスト内包表記のサンプルとして取り上げられることの多いqsortのコードを眺めていて気がついたのですが、

qsort[] = []
qsort(x:xs) = qsort smaller ++ [x] ++ qsprt lerger
              where
                smaller = [ a | a <- xs, a<=x]
                larger = [ b | b <- xs, b> x]

リスト内包記法(smallerとlargerの)部分って、どこかで見たことあると思ったらこれってrubyの"each { | a |”にそっくりなんですよね。

xs = [1,2,3,4,5]
xs.each { |a|
  print a if a <= x
}

Haskellの記法は

A ∩ B = { x | x ∈ A and x ∈ B }

みたいな、とおお〜い記憶の彼方にある数学の集合演算の記法をもとににしているようで、rubyのeach構文もきっとこれをもとにしたのだろうなということが今日わかりました(もちろん、たぶんですが....)

Haskellの構文は数学の素養豊な人にはHaskellの記法もスンナリ頭に入るのかもしれませんが、僕の場合だとrubyの構文のほうがやっぱりわかりやすい気がします。今日の今日まで、なぜeachは"each { | x |"という記法なのか?などということは考えたこともなかったので、"あるプログラミング言語の構文がなぜこのような記法となっているのか?”ということに思い至っただけでもHaskellの勉強を始めた意義があるってモン
ですね。それにしてもHaskellの勉強は遅々としてすすみません!(^^ゞ

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/325

Comments