連続した数列を範囲形式にまとめたい

仕様
* 数値は、半角スペースで区切られた文字列で渡されます。
* 続いている部分は、最初の数値と最後の数値を-(ハイフン)で繋いだ表記にします。
* 連続が1回の場合(前の数も後ろの数も連続でない)は、-(ハイフン)では繋ぎません。
* 出力は、「,」(カンマ)と半角スペースで区切られた文字列でなければなりません。

http://builder.japan.zdnet.com/sp/ruby-doukaku-panel/story/0,3800086254,20369264,00.htm

Haskellでやってみた。

import System.Environment

range [] = []
range (x:xs) = case range xs of
  [y]:r   | x==y-1 -> [x,y]:r
  [y,z]:r | x==y-1 -> [x,z]:r
  r                -> [x]:r

join x = foldl1 ((++).(++x))

main = putStrLn.join ", ".map(join "-".map show).range.map read.words.head =<< getArgs

実行結果

% runghc range.hs '1 2 3 5 7 8 9 12 15 16'
1-3, 5, 7-9, 12, 15-16

全部mainにつっこんだ別解

import System.Environment
main = putStrLn.foldl1((++).(++", ")).map(foldl1((++).(++"-")).map show).foldr(\x s->case s of
    [y]:r   | x==y-1 -> [x,y]:r
    [y,z]:r | x==y-1 -> [x,z]:r
    r                -> [x]:r
  )[].map read.words.head =<< getArgs