Now it works; viz (in response to Brent Yorgey's suggestion, I have merged hanoi and hanoi_helper):
hanoi_general_list_comprehension_unwords.hs (based on Neil Mitchell's suggestion, except for the trailing '.'): hanoi :: a -> a -> a -> Int -> [(a, a)] hanoi source using dest n | n == 1 = [(source, dest)] | otherwise = hanoi source dest using (n-1) ++ hanoi source using dest 1 ++ hanoi using source dest (n-1) hanoi_shower :: Show a => [(a, a)] -> String hanoi_shower moves = unlines [unwords ["Move", show a, "to", show b, "."] | (a, b) <- moves] Then, in WinHugs: Main> :load hanoi_general_list_comprehension_unwords.hs Main> putStr (hanoi_shower (hanoi 'a' 'b' 'c' 2)) Move 'a' to 'b' . Move 'a' to 'c' . Move 'b' to 'c' . Main> putStr (hanoi_shower (hanoi 1 2 3 2)) Move 1 to 2 . Move 1 to 3 . Move 2 to 3 . Notwithstanding Neil's advice on removing the trailing '.', which I appreciate, I would still prefer to retain it, because, in the interests of literate programming, I would like a sequence of English sentences as commands acceptable even to an English teacher. So, to be pedantic and remove the ' ' before the '.' at each line: hanoi_shower portion of hanoi_general_list_comprehension_unlines.hs (based on Neil Mitchell's suggestion): hanoi_shower :: Show a => [(a, a)] -> String hanoi_shower moves = unlines ["Move " ++ show a ++ " to "++ show b ++ "." | (a, b) <- moves] Then, in WinHugs: Main> :load hanoi_general_list_comprehension_unlines.hs Main> putStr (hanoi_shower (hanoi 'a' 'b' 'c' 2)) Move 'a' to 'b'. Move 'a' to 'c'. Move 'b' to 'c'. Main> putStr (hanoi_shower (hanoi 1 2 3 2)) Move 1 to 2. Move 1 to 3. Move 2 to 3. Splendid! Now, just for fun, let's see what other versions also work: hanoi_shower portion of hanoi_general_map_unlines.hs (based on Tillman Rendel's suggestion): hanoi_shower :: Show a => [(a, a)] -> String hanoi_shower moves = unlines (map move moves) where move (a, b) = "Move " ++ show a ++ " to "++ show b ++ "." Then, in WinHugs: Main> :load hanoi_general_map_unlines.hs Main> putStr (hanoi_shower (hanoi 'a' 'b' 'c' 2)) Move 'a' to 'b'. Move 'a' to 'c'. Move 'b' to 'c'. Main> putStr (hanoi_shower (hanoi 1 2 3 2)) Move 1 to 2. Move 1 to 3. Move 2 to 3. Wonderful! Thanks especially to Neil Mitchell and Tillman Rendel for their constructive suggestions. Nevertheless, I'm still working on the recursive version. So far, I've gotten this far: hanoi_shower portion of hanoi_general_recursive.hs (based on Tillman Rendel's suggestion): hanoi_shower :: Show a => [(a, a)] -> String hanoi_shower ((a, b) : moves) | null moves = "Move " ++ show a ++ " to "++ show b ++ "." | otherwise == "Move " ++ show a ++ " to "++ show b ++ "." ++ hanoi_shower moves However, in WinHugs, I get the following error: Hugs> :load hanoi_general_recursive.hs ERROR file:hanoi_general_recursive.hs:11 - Syntax error in declaration (unexpected `}', possibly due to bad layout) I haven't used recursion in Haskell much so far; I've only used it in Scheme, so I'm not used to it. I need to go to lunch now, so I'll work on this part later. Perhaps I can get it to work after lunch.... Benjamin L. Russell --- Neil Mitchell <[EMAIL PROTECTED]> wrote: > Hi > > > hanoi_shower [] = ... > > hanoi_shower ((a, b) : moves) = ... > > > > or (preferably) with map > > > > hanoi_shower moves = unlines (map show_move > moves) where > > show_move (a, b) = ... > > A nice list comprehension works wonders in these > situations: > > hanoi_shower moves = unlines ["Move " ++ show a ++ " > to " ++ show b ++ > "." | (a,b) <- moves] > > I would personally remove the "." from the end, as > its a list of > commands, not sentences - but that is personal > choice. I'd also use > unwords, as its slightly shorter: > > hanoi_shower moves = unlines [unwords ["Move", show > a, "to", show b] | > (a,b) <- moves] > > Thanks > > Neil > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe