How to search for a string sequence in a file a rewrite it???

Tom Pledger Tom.Pledger@peace.com
Fri, 14 Mar 2003 09:59:53 +1300


(moving to haskell-cafe)

Alexandre Weffort Thenorio writes:
 | Ooops a small error before but here is the right one.
 | 
 | Great. I got almost everything. My problem now is:
 | 
 | I got a function called findstr where
 | 
 | findstr "aaaa" "zzzzz" ["xxxxaaaa","xxxaaaaxxx"] =
 | ["xxxxzzzzz","xxxzzzzzxxx"]

with the inferred type
findstr :: String -> String -> [String] -> [String]

 | and then I try something like
 | 
 | fillIn lines = do
 |   bkfilled <- (findstr str str2 lines)

with the inferred type
(findstr str str2 lines) :: [String]

Note that [] (the list data constructor) is a monad.  So, this 'do'
expression is in the [] monad, where perhaps you intended the IO
monad.  Computations in the [] monad have the effect of iterating over
the elements of lists.  So, the bound variable gets the inferred type

bkfilled :: String

which you've noticed in the error message.

 |   write bkfilled
 | 
 | where write takes a [String] and concatenates it writing it to a file then.
 | But I get this error saying:
 | 
 | Expected Type: [String]
 | Inferred Type: String
 | In the first argument of 'write' namelly 'bkfilled'
 | In a do expection pattern binding: write bkfilled
 | 
 | Any idea?? I mean bkfilled is supposed to be [String] but it says it is a
 | String, any idea why???

The smallest code change to fix this is to add a 'return', which will
wrap another monad (in this case, IO) around findstr's [String] result...

> fillIn lines = do
>   bkfilled <- return (findstr str str2 lines)
>   write bkfilled

... but you should be able to simplify that code, using one of the
monad laws in   http://haskell.org/onlinereport/basic.html#sect6.3.6

Regards,
Tom