Does * in (<*>) have a special meaning?

后端 未结 1 1091
臣服心动
臣服心动 2021-02-05 22:51

Trying to expand my understanding about symbols in Haskell :

  • ($) : Function Application operator (Allow you to apply arguments over a function)
  • <
相关标签:
1条回答
  • 2021-02-05 23:27

    This is deliberate. <*> has characteristics of a tensor product. This is best seen in the list monad:

    Prelude> (,) <$> ['a'..'e'] <*> [0..4]
    [('a',0),('a',1),('a',2),('a',3),('a',4)
    ,('b',0),('b',1),('b',2),('b',3),('b',4)
    ,('c',0),('c',1),('c',2),('c',3),('c',4)
    ,('d',0),('d',1),('d',2),('d',3),('d',4)
    ,('e',0),('e',1),('e',2),('e',3),('e',4)]
    

    More generally, applicative functors (aka monoidal functors) map from the product of two objects (i.e. product type, aka tuple or via currying two function arguments) behind the functor to the functor-result of a product before the functor. So it's a pretty product-ey operation indeed.

    φA,B: F AF BF(AB)

    ...in Haskell,

    φ :: (f a, f b) -> f (a,b)
    φ = uncurry (liftA2 (,))
    -- recall `liftA2 f x y = f <$> x <*> y`
    

    or even

    {-# LANGUAGE TypeOperators #-}
    type x ⊗ y = (x,y)
    
    φ :: f a ⊗ f b -> f (a⊗b)
    

    To see the historical side, look into McBride and Paterson 2008 (doi:10.1017/S0956796807006326), the paper that first introduced the Applicative typeclass. They note

    The Applicative class features the asymmetrical operation , but there is an equivalent symmetrical definition.

    class Functor f -> Monoidal f where
        unit :: f ()
        (★) :: f a -> f b -> f (a,b)

    These operations are clearly definable for any Applicative functor...

    So, the <*> is an ASCII rendition of McBride and Paterson's operator, which in turn is an “applicativised” form of which the category theorists call, in uncurried form, φ.

    0 讨论(0)
提交回复
热议问题