Help with meaningful error message...

OK, I am losing enough hair and accruing follicular damage more than I can take tonight, what is wrong, what have I done that is stupid and wrong etc... called: let routes = forwardRoutes M.empty csvdata -- [Record] from Text.CSV implemented: forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows error: scread.hs:101:2: parse error on input `forwardRoutes' Um yeah, thanks, that's really helping me figure it out. All I wanted to do was build a map of keys and values where each value is a list that gradually accumulates(!) every row that ends at (!!1) from the same location (!!0) of my spreadsheet. I started off zipping with 'repeat []' and stuff but I just want to know what I have done to annoy the compiler enough to want to taunt me with that message. And, on the verge of posting I think the above code won't work anyway because I am not passing the new Map from 'insert' through....... ARGH! :(

I think the parse error is here:
forwardRoutes m [] = m
forwardRoutes m (row:rows) =
case M.lookup m (row !! 0) of
Just route -> M.update m (row !! 1):route
Nothing -> M.insert from []
forwardRoutes m rows <----------------- you probably want to remove this line
-deech
On Tue, Jun 7, 2011 at 4:44 PM, Sean Charles
OK, I am losing enough hair and accruing follicular damage more than I can take tonight, what is wrong, what have I done that is stupid and wrong etc...
called: let routes = forwardRoutes M.empty csvdata -- [Record] from Text.CSV
implemented:
forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows
error: scread.hs:101:2: parse error on input `forwardRoutes'
Um yeah, thanks, that's really helping me figure it out.
All I wanted to do was build a map of keys and values where each value is a list that gradually accumulates(!) every row that ends at (!!1) from the same location (!!0) of my spreadsheet. I started off zipping with 'repeat []' and stuff but I just want to know what I have done to annoy the compiler enough to want to taunt me with that message.
And, on the verge of posting I think the above code won't work anyway because I am not passing the new Map from 'insert' through.......
ARGH! :(
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On 07/06/11 22:50, aditya siram wrote:
I think the parse error is here:
forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows<----------------- you probably want to remove this line
If I do that, how does my recursive function call itself again? I think it is badly broken in the syntax! In the last five minutes I have progressed to ... forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert (row!!0) [] forwardRoutes m rows but I think it ought to be... forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> forwardRoutes (M.update m (row !! 1):route) rows Nothing -> forwardRoutes (M.insert (row!!0) []) rows Anybody! LOL :)
-deech
On Tue, Jun 7, 2011 at 4:44 PM, Sean Charles
wrote: OK, I am losing enough hair and accruing follicular damage more than I can take tonight, what is wrong, what have I done that is stupid and wrong etc...
called: let routes = forwardRoutes M.empty csvdata -- [Record] from Text.CSV
implemented:
forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows
error: scread.hs:101:2: parse error on input `forwardRoutes'
Um yeah, thanks, that's really helping me figure it out.
All I wanted to do was build a map of keys and values where each value is a list that gradually accumulates(!) every row that ends at (!!1) from the same location (!!0) of my spreadsheet. I started off zipping with 'repeat []' and stuff but I just want to know what I have done to annoy the compiler enough to want to taunt me with that message.
And, on the verge of posting I think the above code won't work anyway because I am not passing the new Map from 'insert' through.......
ARGH! :(
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

Think about using foldl [1] because it abstracts the general pattern
of recursion you are attempting. So forward routes becomes something
like:
forwardRouter = foldl (\m row -> ...)
Also you might want to move whatever's in "..." into a new function
that updates the map.
-deech
[1] http://hackage.haskell.org/packages/archive/haskell98/latest/doc/html/List.h...
On Tue, Jun 7, 2011 at 4:54 PM, Sean Charles
On 07/06/11 22:50, aditya siram wrote:
I think the parse error is here:
forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows<----------------- you probably want to remove this line
If I do that, how does my recursive function call itself again?
I think it is badly broken in the syntax! In the last five minutes I have progressed to ...
forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert (row!!0) [] forwardRoutes m rows
but I think it ought to be...
forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> forwardRoutes (M.update m (row !! 1):route) rows Nothing -> forwardRoutes (M.insert (row!!0) []) rows
Anybody! LOL :)
-deech
On Tue, Jun 7, 2011 at 4:44 PM, Sean Charles
wrote: OK, I am losing enough hair and accruing follicular damage more than I can take tonight, what is wrong, what have I done that is stupid and wrong etc...
called: let routes = forwardRoutes M.empty csvdata -- [Record] from Text.CSV
implemented:
forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert from [] forwardRoutes m rows
error: scread.hs:101:2: parse error on input `forwardRoutes'
Um yeah, thanks, that's really helping me figure it out.
All I wanted to do was build a map of keys and values where each value is a list that gradually accumulates(!) every row that ends at (!!1) from the same location (!!0) of my spreadsheet. I started off zipping with 'repeat []' and stuff but I just want to know what I have done to annoy the compiler enough to want to taunt me with that message.
And, on the verge of posting I think the above code won't work anyway because I am not passing the new Map from 'insert' through.......
ARGH! :(
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Tuesday 07 June 2011, 23:54:18, Sean Charles wrote:
On 07/06/11 22:50, aditya siram wrote:
I think the parse error is here:
forwardRoutes m [] = m forwardRoutes m (row:rows) =
case M.lookup m (row !! 0) of
Just route -> M.update m (row !! 1):route Nothing -> M.insert from []
forwardRoutes m rows<----------------- you probably want to remove this line
If I do that, how does my recursive function call itself again?
I think it is badly broken in the syntax! In the last five minutes I have progressed to ...
forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> M.update m (row !! 1):route Nothing -> M.insert (row!!0) [] forwardRoutes m rows
but I think it ought to be...
forwardRoutes :: M.Map String [String] -> [Record] -> M.Map forwardRoutes m [] = m forwardRoutes m (row:rows) = case M.lookup m (row !! 0) of Just route -> forwardRoutes (M.update m (row !! 1):route) rows Nothing -> forwardRoutes (M.insert (row!!0) []) rows
Much closer. Now you have a recursion and it can be parsed. The error will now arise in type-checking. You've flipped the arguments in the lookup. In the `Just' case, (M.update m (row !! 1):route) is parsed as (M.update m (row !! 1)) : route which is a list, not a map. You'll need to parenthesize thus: ((row !! 1) : route) However, Prelude> :t Data.Map.update Data.Map.update :: Ord k => (a -> Maybe a) -> k -> Data.Map.Map k a -> Data.Map.Map k a so there's more to change in that branch. It seems that if (row !! 0) is a key in the map, you want to modify the associated value by prepending (row !! 1) to it. That would be achieved by (M.update (\_ -> Just ((row !! 1):route)) (row !! 0) m) But you don't use the value associated to the key here [you could, but you've already looked that up before], so update is probably the wrong function here, try (M.insert (row !! 0) ((row !! 1) : route) m) In the `Nothing' branch, you've omitted the map in which to insert. forwardRoutes m (row@(h:t):rows) = case M.lookup h m of Just route -> forwardRoutes (M.insert h (head t:route) m) rows Nothing -> forwardRoutes (M.insert h [] m) rows would do what I think you want. But it'd better be written as a fold, forwardRoutes m rows = Data.List.foldl' update1 m rows -- you can leave off the arguments if you wish Now, update1 is the single-row update function, e.g. update1 m [] = m -- empty row, do nothing update1 m (x:xs) = case M.lookup x m of Nothing -> M.insert x [] m Just route | null xs -> ? -- what then? | otherwise -> M.insert x (head xs:route) m
participants (3)
-
aditya siram
-
Daniel Fischer
-
Sean Charles