[GHC] #11367: [Regression] Only one clause allowed in (explicitly bidirectional) pattern synonyms

GHC ghc-devs at haskell.org
Thu Jan 7 15:16:13 UTC 2016


#11367: [Regression] Only one clause allowed in (explicitly bidirectional) pattern
synonyms
-------------------------------------+-------------------------------------
        Reporter:  Iceland_jack      |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.1
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Iceland_jack):

 Replying to [comment:8 simonpj]:
 > Well in normal code you can't write
 > {{{
 > f :: Int -> Int
 > }}}
 > and omit the declaration of `f`.  You have to write
 > {{{
 > f :: Int -> Int
 > f = undefined
 > }}}
 > So it's consistent to require the same for pattern synonyms.
 Funny you bring that up! I'm not sure if it's by design or a regression
 but omitting a method declaration (GHC 7.10) used to give a warning:
 {{{
 Prelude> :set -XInstanceSigs
 Prelude> class A a where f :: a
 Prelude> instance A Int where f :: Int

 <interactive>:11:10: Warning:
     No explicit implementation for
       ‘f’
     In the instance declaration for ‘A Int’
 }}}

 while in 8.1:

 {{{
 <interactive>:3:22: error:
     The class method signature for ‘f’ lacks an accompanying binding
       (The class method signature must be given where ‘f’ is declared)
 }}}

 which [https://xkcd.com/1172/ affects me similarly]: I usually turn off
 warnings while churning out code and turn them on afterwards, now one must
 write a dummy definition "f = undefined" (maybe it's not so silly to
 expand standalone type signatures ⸨top-level, where block, instance⸩ into
 a dummy declaration: `-fcut-me-some-slack`....)¹

 > For my money, I think it's maybe a mistake for the
 unidirectional/bidirectional split to be so quietly signaled.  One could
 imagine
 > {{{
 > pattern unidirectional Q a = pat
 > pattern bidirectional P a b = pat
 > pattern bidirectional R x = pat where R = ...
 > }}}
 > But opinions vary.

 May be! I feel it plays into the usual duality between reading and writing
 code. Your suggestion would certainly be clearer to people unfamiliar with
 pattern synonyms and all the different variations thereof, make it easier
 to search for and `grep` code.

 Consider my [comment:5 response to mpickering] as an offhand remark — a
 data point. It certainly should not dictate any design decisions.

 > Usually `where` clauses contain zero or more bindings, which is why an
 empty `where` is usually ok. But here it must contain exactly one. (Two
 would not make sense either.)

 Could you not view a `where` clause in a pattern synonym as containing
 zero bindings (unidirectional) or a single binding (explicitly
 bidirectional).

 ¹ The more I think about it the less objectionable it sounds, as a flag
 solely for development. It's common to write stubs in Haskell given only
 their type with an dummy definition to satisfy the compiler, the compiler
 could expand `getId :: Person -> Id` into

 {{{#!hs
 getId :: Person -> Id
 getId = error "getId:15:1: Not defined."
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11367#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list