Haskell polymorphic calls without complete type knowledge -
i'm studying haskell since little while, i'm newbie.
the following code understandable:
purstrln $ show [1] here can infer types (with defaults), , works well. following code works, too:
putstrln $ show [] even if can't infer list type.
if execute code ghci obtain following:
prelude> [] [] prelude> :t it :: [a] prelude> so type seems polymorphic. in case show called partially applied type.
the same behavior common other types, example data.map.empty, isn't list feature (or @ least seems it).
why , how works?
first of all, works in ghci. if try compile program ghc you'll type error:
test.hs:3:19: ambiguous type variable `a0' in constraint: (show a0) arising use of `show' probable fix: add type signature fixes these type variable(s) in second argument of `($)', namely `show []' in expression: putstrln $ show [] in equation `main': main = putstrln $ show [] adding type signature makes error go away:
module main main = putstrln $ show ([]::[int]) but why did work in ghci? answer extended type defaulting in ghci: type of a defaulted () (the unit type).
the motivation behaviour is bit tiresome user specify types when working in interpreter. vitus notes in comments, running ghci -wall (or adding :set -wall ~/.ghci) makes easier spot defaulting:
<interactive>:2:12: warning: defaulting following constraint(s) type `()' (show a0) arising use of `show' in second argument of `($)', namely `show []' in stmt of interactive ghci command: <- putstrln $ show []
Comments
Post a Comment