原です。

>module Main where
>main = print (take 100 (ramanujan (\(a,b) -> a^3 + b^3)))
>ramanujan f = [(x,y) | (x,y)<- zip s (tail s), f x == f y]
>    where s = fsort f 1
>fsort f k = (k,k) : fmerge f [(k,b) | b<-[k+1..]] (fsort f (k+1))
>fmerge f (x:xs) (y:ys)
>  | f x <= f y = x : fmerge f xs (y:ys)
>  | otherwise  = y : fmerge f (x:xs) ys

解説します。

Haskell では、パラメータへの関数の適用を f(a, b) ではなく、
f a b などと書きます。また関数の定義は = で行います。

で、Ruby との対照表を書くと:

take 100 list         →   list[0, 100]
\(a,b) -> a^3 + b^3   →   proc{|a, b| a**3 + b**3} ていうか関数そのもの
[x | x<- list, p x]   →   list.select{|x| p(x)}
tail list             →   list[1..-1]
zip s t               →   s.zip(t)
x:xs                  →   [x] + xs
(リストと配列をごっちゃにしてる。)

あと

def f(x)
  if p(x) then g(x) else h(x) end
end

を

f x
  | p(x) = g(x)
  | otherwize = h(x)

と書ける。また、パターンマッチといって

def f(a)
  x = a[0]
  xs = a[1..-1]
  ...
end

を

f (x:xs) = ...

とできる。


Haskell の特徴をちょっとだけいうと、まず、とことん
関数プログラミングができるという事でしょう。ここで
いう関数とは、副作用のない、状態を持たない、つまり
数学の関数に近い関数のことです。このままでは何ら外
部に作用を持てなくなるので「モナド」というワケワカ
ラン仕組みを持ってます。もう一つの特徴は徹底して遅
延評価をすることです。関数の引数に対しても遅延評価
する。

「資料」として
  http://www.teu.ac.jp/kougi/koshida/Prog6/
があります。もう一つ、難しい「やさしいHaskell入門」は
  http://www.sampou.org/haskell/tutorial-j/index.html
です。


ところで、Ruby でも Continuation とか Proc とか
Thread とか使うと、この Haskell のコードと同等な
ものが書ける気がするんだけど、、、

もひとつ。Schemer だったらどうするんかいな、という
のがあって、一つの解答が:
  http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Scheme%3aTaxiNumber&l=jp
にあります。