配列を集合に見立ててべき集合を生成する(Haskell 版)

「プログラミング Haskell」に subs という関数が書いてあった。

subs :: [a] -> [[a]]

subs [] = [[]]
subs (x : xs) = (subs xs) ++ map (x :) (subs xs)

Haskell は神の言語か…? ちなみに一説によれば一行でも定義できるらしいのだが…。

追記 : 可読性やメンテナンスのしやすさを考慮すると行数が増えるがこう書いた方が良い。

subs :: [a] -> [[a]]

subs [] = [[]]
subs (x : xs) = xss ++ map (x :) xss
    where xss = subs xs