HaskellっぽいListライブラリ halu-0.0.1をリリースしました

http://rubyforge.org/projects/halu/
インストールはいつものgemでお願いします。(13:50現在、まだGemサーバには反映されていないみたい。)

$ gem install halu

とりあえずサンプルはこんな感じ。
フィボナッチ数列

require 'halu'

include Halu

# フィボナッチ数列のリスト(降順)を返す。
def fib(n)
  case n
  when 0
    List[0]
  when 1
    fib(0) >> 1
  when 2
    fib(1) >> 1
  else
    xs = fib(n - 1)
    xs >> (xs.head + xs.tail.head)
  end
end

p fib(0)       # => Halu::List[0]
p fib(3)       # => Halu::List[2, 1, 1, 0]
p fib(5)       # => Halu::List[5, 3, 2, 1, 1, 0]
p fib(20).head # => 6765

挿入ソート。Haskell版

require 'halu'

include Halu

def insert_sort(xs)
  xs.fold(EMPTY_LIST) do |rs, x|
    rs1, rs2 = rs.span {|h| h < x} # rsをxを挿入する箇所で2つに分ける。
    rs1.append(rs2 >> x)           # rs2の頭にxをつけて全体をrs1の後につける。
  end
end

p insert_sort(List[8, 4, 3, 7, 6, 5, 2, 1])
# => Halu::List[1, 2, 3, 4, 5, 6, 7, 8]

選択ソート。Haskell版

require 'halu'

include Halu

def select_sort(xs)
  if xs.null?
    EMPTY_LIST
  else
    min = xs.minimum                # 最小の要素。
    xs2 = xs.filter {|x| x != min } # それ以外の要素。
    select_sort(xs2) >> min         # 再帰的にソート。
                                    # 先頭に最小の要素をくっつける。
  end
end

p select_sort(List[8, 4, 3, 7, 6, 5, 2, 1])
# => Halu::List[1, 2, 3, 4, 5, 6, 7, 8]

主な使用用途。Lisp(Scheme)インタプリタの自作。その内やるかも。
もうこのライブラリを拡充するのにあきたので、メンテナ募集中です。