
Am Mittwoch, 24. Dezember 2008 02:45 schrieb Raeck Zhao:
hi, good ... morning : ) I am just confused by the following code
oneOnly :: [Int] oneOnly = [1] isOneOnly :: [Int] -> Bool isOneOnly oneOnly = True isOneOnly tester = False
what I want to do is to define a 'type' oneOnly as [1] and use it on the pattern matching in function isOneOnly. But it does not work as I expect:
When I type
isOneOnly [1]
it will be True which is the result I expect but for
is OneOnly [1,2]
the result keeps True, it seems the second pattern has been ignored, I think I try to achieve the purpose in a wrong way, any suggestion?
In "isOneOnly oneOnly ", the pattern oneOnly is a variable pattern, it matches everything, it also matches [] and _|_. the fact that it is also the name of an entity defined elsewhere doesn't matter. You can find more about pattern matching (basically, a pattern is a wildcard, a variable or a constructor applied to patterns) in the report. If you turn on warnings for overlapping patterns, GHC will warn you: $ ghci -fwarn-overlapping-patterns OneOnly GHCi, version 6.8.3: http://www.haskell.org/ghc/ :? for help Loading package base ... linking ... done. [1 of 1] Compiling Main ( OneOnly.hs, interpreted ) OneOnly.hs:4:0: Warning: Pattern match(es) are overlapped In the definition of `isOneOnly': isOneOnly tester = ... Ok, modules loaded: Main. *Main> isOneOnly undefined True Depending on what you want to achieve, maybe isOneOnly [1] = True isOneOnly _ = False or isOneOnly [_] = True isOneOnly _ = False is the solution.
Thanks and Merry Christmas
Best wishes, Raeck