[Haskell-beginners] edit-dist

Andy Larocque ablaroc at gmail.com
Fri Jul 30 16:45:02 EDT 2010


I am a senior who used to do a lot of programming in imperative
languages, and now am new at learning this functional approach.
I have been experimenting with one of Simon Thompson's examples from
his book "The Craft 2e.." ; the edit-distance problem,
and have some questions below I would really appreciate answers to.
Here is the code from his book --

-- A type to represent the different sorts of Edit operations.
data Edit = Change Char |Copy |Delete |Insert Char |Kill
                deriving (Eq,Show)
-- Transforming one string into another, optimally.
transform :: String -> String -> [Edit]
transform [ ] [ ] =  []
transform xs [ ] =  [Kill]
transform [ ] ys =  map Insert ys
transform (x:xs) (y:ys)
  | x==y        =             Copy : transform xs ys
  | otherwise    =  best [ Delete : transform xs (y:ys) ,
                                   Insert y : transform (x:xs) ys,
                                   Change y : transform xs ys ]
--  choose the sequence with the lowest cost.
best :: [ [Edit] ] -> [Edit]
best [ x ]   =  x
best (x:xs)
           | cost x <= cost b    = x
           | otherwise           = b
              where
              b = best xs
-- The cost is given by charging one for every operation except copy.
cost :: [Edit] -> Int
cost = length . filter (/=Copy)
-----------------------------------------------------

-- When I run the program as listed above,with the simple strings shown,
-- the 'optimal' solution is given by

-- transform "AZ" "5Z"  == [Change '5',Copy]

-- but when I replace 'best' with 'concat' in the transform
-- function to see all the possibilities, some strange solutions appear.
--concat gave me one long list, which i tried to break into all the possible
solutions.
- I numbered the 6 ?? possibilities below, and noticed  #5 doesn't provide
any
-- solution at all, and there are 2 'optimal' solutions.
-----------------------------------------------------------------
--transform "AZ" "5Z"  (using 'concat' instead of 'best' )
--  1 [Delete,Delete,Insert '5',Insert 'Z',
--  2 Insert '5',Copy,
--  3 Change '5',Insert 'Z',
--  4 Insert '5',Delete,Copy,
--  5 Insert 'Z',Kill, Change 'Z',Kill,
--  6 Change '5',Copy]
---------------------------------------
- -First, I really would like to know how to print ALL the possibilities as
a list of lists as they are produced
-- in order by the various function calls, not one long list as concat does.
This would let me see how the
-- recursion steps work as well.
-- Secondly, what is happening in #5 possibility above ? The program never
seems to me to check
-- anywhere that (x:xs) has actually become (y:ys). Since "AZ" is really
seen as 'A' : 'Z' : [ ], then some
--  'terminal' case involving [ ]'s  ends the recursion each time, and that
should produce a correct possible sequence?
-- It appears this can end up as an error.
-- A good explanation will go a long ways in my understanding  of this small
aspect of Haskell.
-- I can only hope one of you has the time and patience to answer this
beginner. Thx.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100730/9c1d89e8/attachment-0001.html


More information about the Beginners mailing list