Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • GHC GHC
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 5,249
    • Issues 5,249
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
  • Merge requests 582
    • Merge requests 582
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Releases
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Glasgow Haskell CompilerGlasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #246
Closed
Open
Issue created Jul 29, 2004 by Simon Peyton Jones@simonpjDeveloper

Wrong pat-match order for records

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"
Edited Mar 09, 2019 by Simon Peyton Jones
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking