[Haskell] [Oz] Function that computes the permutation of a list
Mozart Oz Programming Language
Haskell Programming Language
declare fun {Permutation L} case L of nil then [nil] [] H|T then {FoldR {Map {Permutation T} fun {$ X} % Inser H into all position IntFrom in fun lazy {IntFrom K} K|{IntFrom K+1} end {Map {List.take {IntFrom 0} {List.length X}+1} fun {$ Pos} {FoldR X (fun {$ J K} case K of nil then nil [] S#I then if I \= Pos-1 then {Append [J] S}#(1+I) else {Append [H J] S}#(1+I) end end end) ({List.drop [H] Pos}#0) }.1 end} end } fun {$ X Y} {Append X Y} end nil } end end %{Browse {Permutation [a]}} % shows [[a]] %{Browse {Permutation nil}} % shows [nil] {Browse {Permutation [a b c]}} % shows [[c b a] [c a b] [a c b] % [b c a] [b a c] [a b c]]
Haskell Programming Language
-- function that computes the permutations of a list -- permutation ["a","b","c"] permutation :: [a] -> [[a]] permutation xs0 = xs0 : perms xs0 [] where perms [] _ = [] perms (t:ts) is = foldr interleave (perms ts (t:is)) (permutation is) where interleave xs r = let (_,zs) = interleave' id xs r in zs interleave' _ [] r = (ts, r) interleave' f (y:ys) r = let (us,zs) = interleave' (f . (y:)) ys r in (y:us, f (t:y:us) : zs)
Comments
Post a Comment