Chris Kuklewicz wrote:

[snip]


There are other modules that come with Haskell than
Text.ParserCombinators.Parsec
such as
Text.ParserCombinators.ReadP

The solution with ReadP makes for a very short 'parse' function.  Note that
reader is built in a recursive manner.

module Morse where

import Control.Monad(guard)
import Text.ParserCombinators.ReadP

parse = map fst . readP_to_S reader
  where reader = done <++ choice (map pairToReader table)
        done = look >>= guard . null >> return []
        pairToReader (s,c) = string s >> fmap (c:) reader

table = (".-",'A'):
        ("-...",'B'):
        ("-.-.",'C'):
        ("-..",'D'):
        (".",'E'):
        ("..-.",'F'):
        ("--.",'G'):
        ("....",'H'):
        ("..",'I'):
        (".---",'J'):
        ("-.-",'K'):
        (".-..",'L'):
        ("--",'M'):
        ("-.",'N'):
        ("---",'O'):
        (".--.",'P'):
        ("--.-",'Q'):
        (".-.",'R'):
        ("...",'S'):
        ("-",'T'):
        ("..-",'U'):
        ("...-",'V'):
        (".--",'W'):
        ("-..-",'X'):
        ("-.--",'Y'):
        ("--..",'Z'):
        []

The table is sorted which means the result of 'parse' is in sorted alphabetical
order.

It also does not check which are dictionary words, so it finds many solutions:

*Morse> length $ parse "...---..-....-"
5104

*Morse> take 10 $  parse "...---..-....-"
["EEAGAEEEA","EEAGAEEEET","EEAGAEEIT","EEAGAEEU","EEAGAEIA","EEAGAEIET","EEAGAEST","EEAGAEV","EEAGAHT","EEAGAIEA"]

Thanks Chris, that's a neat solution and an eye opener for me -- I need to investigate the Text package I think.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to