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)インタプリタの自作。その内やるかも。
もうこのライブラリを拡充するのにあきたので、メンテナ募集中です。