順列

順列をリストモナドでどう書くのだろう,と,ふと思いたち書いてみた.


remove _ [] = []
remove x (y:ys) = if x == y then ys else y : (remove x ys)

perm _ [] = [[]]
perm 1 l = do x <- l
return [x]
perm n l = do x <- l
xs <- perm (n - 1) (remove x l)
return (x:xs)