Skip to content
  • David Feuer's avatar
    Deriving for phantom and empty types · 69f070d8
    David Feuer authored
    Make `Functor`, `Foldable`, and `Traversable` take advantage
    of the case where the type parameter is phantom. In this case,
    
    * `fmap _ = coerce`
    * `foldMap _ _ = mempty`
    * `traverse _ x = pure (coerce x)`
    
    For the sake of consistency and especially simplicity, make other types
    with no data constructors behave the same:
    
    * `fmap _ x = case x of`
    * `foldMap _ _ = mempty`
    * `traverse _ x = pure (case x of)`
    
    Similarly, for `Generic`,
    
    * `to x = case x of`
    * `from x = case x of`
    
    Give all derived methods for types without constructors appropriate
    arities. For example,
    
    ```
        compare _ _ = error ...
    ```
    
    rather than
    
    ```
        compare = error ...
    ```
    
    Fixes #13117 and #13328
    
    Reviewers: austin, bgamari, RyanGlScott
    
    Reviewed By: RyanGlScott
    
    Subscribers: ekmett, RyanGlScott, rwbarton, thomie
    
    Differential Revision: https://phabricator.haskell.org/D3374
    69f070d8