[GHC] #12376: Allow function definitions in record syntax

GHC ghc-devs at haskell.org
Thu Oct 6 22:41:44 UTC 2016


#12376: Allow function definitions in record syntax
-------------------------------------+-------------------------------------
        Reporter:  Iceland_jack      |                Owner:
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by Iceland_jack):

 I'm not sure about that, it's possible that there would be more
 ''bang''-per-''buck'' in extending `LambdaCase` with `\case2`, `\case3`.

 Take an example of dictionary translation from
 [https://skillsmatter.com/skillscasts/8978-checking-and-translating-type-
 classes Checking and translating type classes]:

 {{{#!hs
 import Prelude hiding (Eq (..))

 data Eq a = MkEq
   { (==) :: a -> a -> Bool
   , (/=) :: a -> a -> Bool
   }
 }}}

 {{{#!hs
 -- Default definition of (/=)
 neqDef :: Eq a -> a -> a -> Bool
 neqDef = not .:: (/=) where
   (.::) = fmap.fmap.fmap

 eqList :: forall a. Eq a -> Eq [a]
 eqList a = MkEq
   { (==) = aux
   , (/=) = neqDef (eqList a)
   } where

   aux :: [a] -> [a] -> Bool
   aux []     []     = True
   aux (x:xs) (y:ys) = (==) a x y && (==) (eqList a) xs ys
   aux _      _      = False
 }}}

 Now if we wanted to inline `aux` using this ticket, they would presumably
 translate into lambdas (single clause):

 {{{#!hs
 eqList a = MkEq
   { a == b = case (a, b) of
       ([],   [])   -> True
       (x:xs, y:ys) -> ...
       (_,    _)    -> False

 -- Translates into
 --
 -- eqList a = MkEq
 --   { (==) = \a b -> ...
 }}}

 A hypothetical `\case2` may be better

 {{{#!hs
 eqList a = MkEq
   { (==) = \case2
       ([],   [])   -> True
       (x:xs, y:ys) -> ...
       (_,    _)    -> False
   , (/=) = neqDef (eqList a)
   }
 }}}

 Given an extension that allows user to omit tuple parentheses when un-
 ambiguous (similar to Agda's `_,_` constructor which looks like `a , b`
 when applied to two arguments) this looks even better

 {{{#!hs
 eqList a = MkEq
   { (==) = \case2
       [],   []   -> True
       x:xs, y:ys -> ...
       _,    _    -> False
   , (/=) = neqDef (eqList a)
   }
 }}}

 Should I create a ticket for these ideas or use the new
 [https://github.com/ghc-proposals/ghc-proposals GHC Proposals]?

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


More information about the ghc-tickets mailing list