He Daniel, 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. It now looks like this: module Main where import Data.Char import System import qualified Data.Map as M import Control.Applicative ((<$>)) --- CONFIG SECTION --- -- add the characters you want to permutate here-- rules :: Rules rules = M.fromList [ 'a' ==> "@", 'l' ==> "|", 'w' ==> "\\|/", 'v' ==> "\\/", 'o' ==> "0"] data WordTree = Chain String WordTree | Choice String WordTree String WordTree | Stop deriving Show --instance Show WordTree where -- show = unlines.showTree type Rules = M.Map Char [Char] infixl 4 ==> (==>) :: a -> b -> (a, b) a ==> b = (a, b) buildTree :: String -> Rules -> WordTree buildTree [] r = Stop buildTree (c:cs) r = case M.lookup c r of Just a -> let p = buildTree cs r in Choice a p [c] p Nothing -> Chain [c] $ buildTree cs r showTree :: WordTree -> [String] showTree (Chain a b) = [a ++ xs | xs <- showTree b] showTree (Choice a b c d) = [a ++ xs | xs <- showTree b] ++ [c ++ ys | ys <- showTree d] showTree Stop = [""] main :: IO () main = do filename <- head <$> getArgs wordlist <- readFile $ filename let a = (flip buildTree $ rules) <$> (lines wordlist) >>= showTree mapM_ putStrLn a ~ On Wed, Feb 10, 2010 at 1:47 PM, edgar klerks <edgar.klerks@gmail.com>wrote:
He Daniel,
I use the Data.Map now, this makes it way more flexibler
data WordTree
= Branch [(Char, WordTree)] | Tip
I only don'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).
Share the subtree, Just a -> let st = buildTree cs r in Choice (a,st) (c,st)
Stupid thing not to do, think I overlooked it :)
Thanks again.
Edgar
-- Flatliner ICT Service, Email: Edgar.klerks@gmail.com, Tel: +31727851429 Fax: +31848363080 Skype: edgar.klerks Website: flatlinerict.nl Adres: Koelmalaan 258, 1813JD, Alkmaar Nederland