原です。

> こんにちは。ささだです。
>
>  [ [ruby-math:00851] Ramanujan Number ]
>  Mon, 12 May 2003 10:19:05 +0900 への返信です。
>
> Haskell っぽい書き方なバージョンです。

やはり出来ますね!

実は私も「Rubyプログラミング入門」で唐突にも遅延評価の話を書い
ていました。こんな役に立たない節なんか無くていいという説があっ
て、すっかり記憶から追い出していたのですが、読み返すととささだ
さんのコードとほとんどおなじで、[a, lamda{b}] を List.new(a){b} 
のように表現しているだけでした。で、fsort と fmerge を実装して
みたら動いたので感激。(そんな事でいいのか)

def List(x, &b)
  List.new(x, &b)
end

class List
  def initialize(h, &t)
    @head = h
    @tail = t
  end

  def head
    @head
  end
  
  def tail
    @tail.call
  end

  def null?
    @head.nil?
  end

  def each(&b)
    unless null?
      b[head]
      tail.each(&b)
    end
  end

  def map(&b)
    if null?
      List(nil)
    else
      List(b[head]){tail.map(&b)}
    end
  end

  def filter(&b)
    if null?
      List(nil)
    else
      b[head] ? List(head){tail.filter(&b)} : tail.filter(&b)
    end
  end

  def zip(other)
    if null? or other.null?
      List(nil)
    else
      List([head, other.head]){tail.zip(other.tail)}
    end
  end

  def take(n)
    if null? or n <= 0
      List(nil)
    else
      List(head){tail.take(n-1)}
    end
  end
end

def integers(n)
  List(n){integers(n+1)}
end

def fsort(f, k)
  List([k, k]){fmerge(f, integers(k+1).map{|b| [k, b]}, fsort(f, k+1))}
end

def fmerge(f, a, b)
  if f[a.head] <= f[b.head]
    List(a.head){fmerge(f, a.tail, b)}
  else
    List(b.head){fmerge(f, a, b.tail)}
  end
end

def ramanujan(f)
  s = fsort(f, 1)
  s.zip(s.tail).filter{|u| f[u[0]] == f[u[1]]}
end

ramanujan(proc{|v| v[0]**3 + v[1]**3}).take(5).each do |x|
  p x
end

元ネタは SICP なんですけどね。

いままで役に立つ例として、エラストテネスのふるいしか無かったの
だけど、ひとつ増えてうれしいです。

[エラストテネスのふるい]
def sieve(s)
  x = s.head
  List(x){sieve(s.tail.filter{|y| y % x != 0})}
end

sieve(integers(2)).take(30).each do |x|
  p x #=> 2, 3, 5, 7, 11,...
end


>p take 10,filter(zip(fsort(1),cdr(fsort(1)))){|x|  f(x[0]) == f(x[1]) }
>
>
> 実行は、非常に効率が悪いので、全然終わらないんですが ^^;

あれ、こっちでは一つも出力がない。Ruby のバグ?

> なんとなく Haskell っぽいコードを Ruby で書いてみる部門、でした。

結局これは Scheme でも書けるわけで、どちらかというとたらいまわし
関数の方が Hakell の特徴が出ていると言えるのかな。