[Haskell-cafe] Re: Embedding newlines into a string?

Tillmann Rendel rendel at daimi.au.dk
Mon Apr 14 05:27:11 EDT 2008


Benjamin L. Russell wrote:
> Ok; much better.  Here's my new type signature and
> definition:
> 
> hanoi :: Int -> IO ()   
> hanoi_helper :: Char -> Char -> Char -> Int -> [String]

If you want, you can separate the algorithm and the output processing 
even more by providing three functions of these types:

hanoi :: Int -> [(Char, Char)]
hanoi_helper :: Char -> Char -> Char -> Int -> [(Char, Char)]
hanoi_shower :: [(Char, Char)] -> String

and at the interpreter level:

   > putStr (hanoi_shower (hanoi 2))

added value: you can easily use the output of hanoi for automated 
processing (e.g. testing, controlling a robot, producing an animation, 
counting the number of steps).

You can go one step further if you consider that towers don't have to be 
named by single characters, but can be named by everything:

hanoi :: a -> a -> a -> Int -> [(a, a)]
hanoi_helper :: a -> a -> a -> Int -> [(a, a)]
hanoi_shower :: Show a => [(a, a)] -> String

now you can use

   > putStr (hanoi_shower (hanoi 'a' 'b' 'c' 2))

to get the same result as above, but you are also allowed to write

   > putStr (hanoi_shower (hanoi 1 2 3 2))

if you want to use numeric tower names.

   Tillmann


More information about the Haskell-Cafe mailing list