[Haskell-beginners] Expected / Inferred mis-match and confused!

Antoine Latter aslatter at gmail.com
Thu Jun 9 18:41:49 CEST 2011


It is this line:

> Just routes -> M.insert key val:routes map

Function application binds the tightest, so the compiler interprets this as:

> Just routes -> (M.insert key val) : (routes map)

Which is presumably not what you meant.


On Thu, Jun 9, 2011 at 11:26 AM, Sean Charles <sean at objitsu.com> wrote:
> Here are the snippets of my code currently hurting my coding ulcer...
>
> routes :: [Record] -> IO ()
> routes legodata = do
>  let all = foldl forwardRoutes M.empty legodata -- [Record]
>  return ()
>
>
> forwardRoutes :: M.Map String [String] -> Record -> M.Map String [String]
> forwardRoutes map row =
>  let key = row !! 0 in
>  let val = row !! 1 in
>  case lookup key map of
>    Nothing     -> M.insert key [val] map
>    Just routes -> M.insert key val:routes map
>
> -- some 'deductions' by me, probably erroneous, to help me try to figure it
> out
> --
> --if legodata is [Record]
> --   then row is Record  => [Field]
> --
> -- if map is "String [String]"
> --   then key is Field because row is [Field]
> --   then val is Field because row is [Field]
> --   Field is "String"
> --
> -- lookup key map => lookup String M.Map String [String]
> --
>
> If I am fold-ing over [Record] then I assume that the data that is passed to
> the callback function is of the type Record, i.e. a single thing from the
> list of things. Record is defined as [Field] so presumably I could use
> [Field] or Record in my function 'forwardRoutes'.
>
> When I compile the above I get:
>
> scread.hs:92:18:
>    Couldn't match expected type `[(Field, b)]'
>           against inferred type `M.Map String [String]'
>    In the second argument of `lookup', namely `map'
>    In the expression: lookup key map
>    In the expression:
>        case lookup key map of {
>          Nothing -> M.insert key [val] map
>          Just routes -> M.insert key val : routes map }
>
> I have spent a long time searching and reading and trying to fathom it out
> from first principles but I cannot for the life of me figure out where
> '[(Field, b)]' is coming from! I can smell Field in there because Record is
> typed as [Field], but a tuple? And what is 'b' ?
>
> The 'inferred type' matches what I thought it should be in the error message
> and I am right (I think) in stating that the 'expected type' is what it
> actually got from the code at compile time?!
>
> Help!
> :)
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>



More information about the Beginners mailing list