
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
2010/3/4 Rahul Kapoor
methods :: (Eq a) => [(String, a)] methods = [ ("method1", undefined ) , ("method2", undefined) ]
enumerateMethodNames :: [String] enumerateMethodNames = map fst methods
The above does not compile because the source does not have 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