He Daniel.
I have some trouble understanding what you are saying here:
> -- first I need to find the positions of the mutatable charachters.
No, you don't need to do that, it's in general more efficient to not care
about positions when dealing with lists.
> findPositions :: [Char] -> [[Int]]
> findPositions xs = take (length index) $ index <*> [xs]
> where index = elemIndices <$> leata
[f1, ..., fm] <*> [x1, ..., xn]
produces a list of length m*n, so
length (index <*> [xs]) == length index * length [xs] == length index
~> remove "take (length index) $"
About this piece of code:
fmap snd <$> fmap unzip <$> p
Prelude Control.Applicative> let p = [[[(1,2),(3,4),(4,5)]]]
Prelude Control.Applicative> fmap snd <$> fmap unzip <$> p
[[[2,4,5]]]
Prelude Control.Applicative>
But yeah, it is ridiculously complicated. And I made it up by trial and error and looking at the types.
I have a better approach now. I am now building a tree and then walk trough it to collect all the permutations.
Thanks for your help and effort!
Edgar