He Daniel, <br><br>I used your showTree function because it works better than mine. I also think the program is now truly functional. I will try to implement the other tree on my own to see how it goes. <br><br>It now looks like this:<br>
<br>module Main where<br>import Data.Char<br>import System<br>import qualified Data.Map as M<br>import Control.Applicative ((&lt;$&gt;))<br><br>--- CONFIG SECTION ---<br><br>-- add the characters you want to permutate here--<br>
rules :: Rules<br>rules = M.fromList [<br>        &#39;a&#39; ==&gt; &quot;@&quot;,<br>        &#39;l&#39; ==&gt; &quot;|&quot;,<br>        &#39;w&#39; ==&gt; &quot;\\|/&quot;,<br>        &#39;v&#39; ==&gt; &quot;\\/&quot;,<br>
        &#39;o&#39; ==&gt; &quot;0&quot;]<br><br><br><br>data WordTree = Chain String WordTree<br>        |   Choice String WordTree String WordTree<br>        |   Stop<br>        deriving Show<br><br>--instance Show WordTree where<br>
--      show = unlines.showTree<br><br>type Rules = M.Map Char [Char]<br><br>infixl 4 ==&gt;<br>(==&gt;) :: a -&gt; b -&gt; (a, b)<br>a ==&gt; b = (a, b)<br><br><br><br>buildTree :: String -&gt; Rules -&gt; WordTree<br>buildTree [] r = Stop<br>
buildTree (c:cs) r = case M.lookup c r of<br>                        Just a -&gt;  let p = buildTree cs r<br>                                   in Choice a p [c] p<br>                        Nothing -&gt; Chain [c] $ buildTree cs r<br>
<br>showTree :: WordTree -&gt; [String]<br>showTree (Chain a b) = [a ++ xs | xs &lt;- showTree b]<br>showTree (Choice a b c d) = [a ++ xs | xs &lt;- showTree b] ++ [c ++ ys | ys &lt;- showTree d]<br>showTree Stop = [&quot;&quot;]<br>
<br>main :: IO ()<br>main = do<br>        filename &lt;- head &lt;$&gt; getArgs<br>        wordlist &lt;- readFile $ filename<br>        let a = (flip buildTree $ rules) &lt;$&gt; (lines wordlist) &gt;&gt;= showTree<br>        mapM_ putStrLn a<br>
~                         <br><br><div class="gmail_quote">On Wed, Feb 10, 2010 at 1:47 PM, edgar klerks <span dir="ltr">&lt;<a href="mailto:edgar.klerks@gmail.com">edgar.klerks@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
He  Daniel,<br><br> I use the Data.Map now, this makes it way more flexibler<br><br><br><div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


data WordTree<br>
    = Branch [(Char, WordTree)]<br>
    | Tip<br>
<br></blockquote></div><div><br>I only don&#39;t use this type of Tree. I am not sure how it works, but it looks good, so I will experiment with it. Is it a so called rose tree? (Then I can find some articles about it). <br>
 </div><div class="im">
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><br>
</div>Share the subtree,<br>
                        Just a -&gt; let st = buildTree cs r<br>
                                  in Choice (a,st) (c,st)<br>
<br></blockquote></div><div>Stupid thing not to do, think I overlooked it :) <br><br>Thanks again.<br><br>Edgar <br></div></div>
</blockquote></div><br><br clear="all"><br>-- <br>Flatliner ICT Service,<br>Email: <a href="mailto:Edgar.klerks@gmail.com">Edgar.klerks@gmail.com</a>,<br>Tel: +31727851429<br>Fax: +31848363080<br>Skype: edgar.klerks<br>Website: <a href="http://flatlinerict.nl">flatlinerict.nl</a><br>
Adres: Koelmalaan 258,<br>1813JD, Alkmaar<br>Nederland<br>