Skip to content

Add `liftA2` to Prelude

{-# LANGUAGE DeriveFunctor #-}

data Foo a = Foo a deriving (Functor)

instance Applicative (Foo) where
  pure = Foo

Since base shipped with GHC 8.2, this gives the following warning:

warning: [-Wmissing-methods]
    • No explicit implementation for
        either ‘<*>’ or ‘GHC.Base.liftA2’
    • In the instance declaration for ‘Applicative Foo’

Trying to follow up on this literally,

instance Applicative Foo where
  pure = Foo
  GHC.Base.liftA2 f (Foo a) (Foo b) = Foo $ f a b

I get other errors:

    ‘GHC.Base.liftA2’ is not a (visible) method of class ‘Applicative’
   |
10 |   GHC.Base.liftA2 f (Foo a) (Foo b) = Foo $ f a b
   |   ^^^^^^^^^^^^^^^

    Qualified name in binding position: GHC.Base.liftA2
   |
10 |   GHC.Base.liftA2 f (Foo a) (Foo b) = Foo $ f a b
   |   ^^^^^^^^^^^^^^^

GHC is giving me contradictory information here.
The workaround is import Control.Applicative, but it seems inconsistent that some methods of Applicative are exported by Prelude and some not, especially those that comprise a MINIMAL definition of an instance.

Proposal: export liftA2 also from Prelude.

Related: #13191 (closed), referenced in https://hackage.haskell.org/package/base-4.10.0.0/changelog

Edited by vdukhovni
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information