
On Thursday 27 January 2011 15:55:58, Renzo Orsini wrote:
In studying Haskell, I produced the following output from GHC:
xxx-3:~ xxx$ GHCi GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude> let f 7 = "ok" Prelude> let f x = "no" Prelude> f 3 "no" Prelude> f 7 "no"
I suppose it is correct. However, for someone who is interested in the language, it seems very counterintuitive... Somebody would be so kind to explain to a neophyte this "feature" of the language?
It's not a feature of the language, it's a feature of the interpreter. In ghci's own words (evoked by the -Wall flag): Prelude> let f 7 = "ok" <interactive>:1:5: Warning: Pattern match(es) are non-exhaustive In an equation for `f': Patterns not matched: #x with #x `notElem` [7#] Prelude> let f x = "no" <interactive>:1:5: Warning: This binding for `f' shadows the existing binding bound at <interactive>:1:5 <interactive>:1:7: Warning: Defined but not used: `x' You have defined two independent functions, the second overwriting the first binding. To get what you wanted, you have to put the branches on the same line, separated by a semicolon: Prelude> let f 7 = "ok"; f _x = "no" (0.02 secs, 3348380 bytes) Prelude> f 3 "no" (0.01 secs, 1962728 bytes) Prelude> f 7 "ok" (I prefixed the x with an underscore in the second equation to preven an "unused variable" warning, could also have used the wildcard _).
Thank you very much.
Renzo
Cheers, Daniel