1to100penさんのヒントにより書いたもの

data List = Nil | List ::: List を使った.
Python 読めないので,Pythonの解と同じかどうかは良くわからない.

data List = Nil | List ::: List

r :: Int -> List
r 0 = Nil
r n = powerset (r (n-1))

powerset :: List -> List
powerset Nil         = Nil ::: Nil
powerset (xs ::: ys) = yss >< mapL (xs :::) yss where yss = powerset ys

mapL :: (List -> List) -> List -> List
mapL f Nil = Nil
mapL f (h ::: t) = f h ::: mapL f t

infixr 5 ><, :::

(><) :: List -> List -> List
(xs ::: ys) >< zs = xs ::: (zs >< ys)
Nil         >< zs = zs

instance Show List where
  show = pprL

pprL :: List -> String
pprL = flip pprh' ""
  where
    pprh' Nil = zr
    pprh' (h ::: t) = ob . nl . sp . pprh h . nl . pprt' t . cb
    pprh Nil = zr
    pprh (h ::: t) = ob . pprh h . pprt t . cb
    pprt' Nil = id
    pprt' (h ::: t) = cm . pprh h . nl . pprt' t
    pprt Nil = id
    pprt (h ::: t) = cm . pprh h . pprt t
    nl = ('\n':); ob = ('{':); cb = ('}':); cm = (',':); zr = ('0':); sp = (' ':)