>  豊福です。

In [ruby-math:00888] 
| >   この fsort は「f([x,y]) は x と y に関して単調増加」を
| > 想定しているんですよね。
|
|   「x と y が対称」というのも入ってました。対称でないときは

ええ、そうですね。だから fsort という名前は一般性があり
すぎる。

In [ruby-math:00889]
>def fsort(f, x)
>  h = x.head; t = x.tail
>  List([h, h]){fmerge(f, t.map{|b| [h, b]}, fsort(f, t))}
>end
>
>def goldbach(f)
>  fsort(f, sieve(integers(2)).tail)
>end
>
>goldbach(proc{|v| v[0] + v[1]}).take(100).each do |x|
>  p [x[0]+x[1], x]
>end

うまい! fsort の中の integers を外に出したんですね。
ただ、fsort の x.tail の評価は

def fsort(f, x)
  h = x.head
  List([h, h]){t = x.tail; fmerge(f, t.map{|b| [h, b]}, fsort(f, t))}
end

と遅延させた方がいいでしょう。

いっその事これを List の中に入れてしまって、

class List
  def take_pair_sorted_by(&f)
    h = head
    List([h, h]){
      t = tail
      t.map{|b| [h, b]}.merge_by(t.take_pair_sorted_by(&f), &f)
    }
  end
  
  def merge_by(b, &f)
    ah = head
    bh = b.head
    if f.call(ah[0], ah[1]) <= f.call(bh[0], bh[1])
      List(ah){tail.merge_by(b, &f)}
    else
      List(bh){merge_by(b.tail, &f)}
    end
  end
end

とかしたら、

primes = sieve(integers(2))
goldbach = primes.take_pair_sorted_by{|v| v[0] + v[1]}.tail
goldbach.take(50).each do |x|
  p [x[0]+x[1], x]
end

となって、もっとかっこいい。でも、かっこ良くなる度に遅くなるみた
い。