Thanks. I realize there are many ways to make it compile.
However, I am trying to understand the mechanism behind --
why does the first example compile and what constraints does
enumerateMethodNames add on a (which it does not inspect)?
cheers,
Marcus
> methods :: (Eq a) => [(String, a)]The above does not compile because the source does not have
> methods =
> [ ("method1", undefined )
> , ("method2", undefined)
> ]
>
> enumerateMethodNames :: [String]
> enumerateMethodNames = map fst methods
enough information for GHC to determine what actual types to use
for "methods" since undefined can stand in as values for any
type. The program will compile if you use actual values instead
of undefined or supply an explicit type signature.
for example:
enumerateMethodNames = map fst (methods :: [(String, String)])
or
methods :: [(String, SomeEqType)]
Rahul