Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Trying to expand my understanding about symbols in Haskell :

  • ($) : Function Application operator (Allow you to apply arguments over a function)
  • (&) : flipped version of Function Application Operator? (&) = flip ($)
  • (<>) : associative operator (You'll find it in Semigroups and Monoids)
  • (<$>) : function application ($) lifted over a Functor structure
  • (<&>) : flipped functor map

Can we make a link between (*) and (<*>)?

I don't understand the meaning of * actually...

like image 841
Nicolas Henin Avatar asked Apr 04 '19 10:04

Nicolas Henin


People also ask

What does * Its mean?

Its is the possessive form of the pronoun it—it means belonging to it. It's is a contraction of it is or it has—meaning that it's a combination of the two words, making it shorter to say.

What is a special word?

Special Words Are Those Words that Start and End with the Same Letter. Examples: Existence Comic Window Palindrome Words Are Those Words Which Read the Same from Left to Right - Computer Applications | Shaalaa.com. ICSE Class 10.

What type of word is special?

special (adjective) special (noun) special agent (noun)


1 Answers

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, φ.

like image 160
leftaroundabout Avatar answered Oct 04 '22 18:10

leftaroundabout