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 <rk@trie.org>
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