[Haskell] confusing language in report and a bug in (ghc|hugs)

John Meacham john at repetae.net
Wed Jul 28 22:33:12 EDT 2004


in section 3.17.2 case #6 of the haskell report

There is some confusing language in the report. Furthermore  there is
either a bug in ghc, or hugs, depending on which way you interpret it.

it says:

# Matching against a constructor using labeled fields is the same as
# matching ordinary constructor patterns except that the fields are
# matched in the order they are named in the field list. All fields
# listed must be declared by the constructor; fields may not be named
# more than once. Fields not named by the pattern are ignored (matched
# against _).

 If you interpret 'field list' to mean the order the fields appear in the
pattern then given the code below "bar" should be printed, as the 'b'
field is compared and fails so the a field is never matched against. 


If you interpret 'field list' to mean the order the fields were DECLARED
in, then this should equal _|_ as the 'a' field is matched first and is
undefined.

ghc seems to follow the second interpretation, hugs the first.
 
If the first is indeed the correct interpretation, (it is what I
thought) I don't see a trivial translation to dispose of fields, as
there is no easy way in Haskell98 to change the order of pattern matching
without rewriting everything as a big mess of nested cases. (i mean,
obviously it can be done, but the translation is harder than just
placing the patterns in the right slots and dropping the field names)


-- the code --
data Foo = Foo { a,b::Int }

au = Foo { a = undefined, b = 0 }

main = case au of 
    Foo { b = 1, a = 0 } -> print "foo"
    _ -> print "bar"


ghc => error: Prelue.undefined
hugs => "bar"

-- 
John Meacham - ⑆repetae.net⑆john⑈ 


More information about the Haskell mailing list