logo       

[ ghc-Bugs-999936 ] Wrong pat-match order for records: msg#00025

lang.haskell.glasgow.bugs

Subject: [ ghc-Bugs-999936 ] Wrong pat-match order for records

Bugs item #999936, was opened at 2004-07-29 08:07
Message generated for change (Settings changed) made by simonmar
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=999936&group_id=8032

>Category: Compiler
Group: None
Status: Open
Resolution: None
>Priority: 2
Submitted By: Simon Peyton Jones (simonpj)
>Assigned to: Simon Peyton Jones (simonpj)
Summary: Wrong pat-match order for records

Initial Comment:
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"


----------------------------------------------------------------------

You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=108032&aid=999936&group_id=8032


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise