Els funtors aplicatius són una generalització dels funtors que permeten aplicar funcions encapsulades en contextos. Són una part fonamental de la programació funcional en Haskell i proporcionen una manera poderosa de treballar amb efectes i contextos.

Conceptes Clau

Definició de Funtor Aplicatiu

Un funtor aplicatiu és una estructura que permet aplicar funcions encapsulades en contextos a valors encapsulats en contextos. Es defineix per la classe de tipus Applicative, que és una subclasse de Functor.

class Functor f => Applicative f where
    pure  :: a -> f a
    (<*>) :: f (a -> b) -> f a -> f b
  • pure pren un valor i l'encapsula en un context.
  • (<*>) (anomenat "aplicatiu") pren una funció encapsulada en un context i un valor encapsulat en un context, i aplica la funció al valor.

Exemple de Funtor Aplicatiu

Vegem un exemple amb el tipus Maybe:

instance Applicative Maybe where
    pure = Just
    Nothing <*> _ = Nothing
    (Just f) <*> something = fmap f something

Això permet aplicar funcions encapsulades en Maybe a valors encapsulats en Maybe:

ghci> pure (+3) <*> Just 5
Just 8

ghci> Just (+3) <*> Just 5
Just 8

ghci> Nothing <*> Just 5
Nothing

ghci> Just (+3) <*> Nothing
Nothing

Operadors Addicionals

Els funtors aplicatius també proporcionen altres operadors útils:

  • (*>) i <* permeten seqüenciar accions, ignorant el resultat d'una d'elles.
(*>) :: Applicative f => f a -> f b -> f b
(<*) :: Applicative f => f a -> f b -> f a

Exemple Pràctic

Suposem que volem sumar els valors de dues llistes, però encapsulats en el context de Maybe:

addMaybes :: Maybe Int -> Maybe Int -> Maybe Int
addMaybes mx my = pure (+) <*> mx <*> my

ghci> addMaybes (Just 3) (Just 5)
Just 8

ghci> addMaybes Nothing (Just 5)
Nothing

Exercicis Pràctics

Exercici 1: Implementar Applicative per una Llista

Implementa la instància de Applicative per a les llistes.

instance Applicative [] where
    pure x = [x]
    fs <*> xs = [f x | f <- fs, x <- xs]

Exercici 2: Utilitzar Applicative amb Either

Utilitza Applicative per treballar amb el tipus Either:

instance Applicative (Either e) where
    pure = Right
    Left e <*> _ = Left e
    Right f <*> r = fmap f r

Prova-ho amb exemples:

ghci> pure (+3) <*> Right 5
Right 8

ghci> Left "Error" <*> Right 5
Left "Error"

Errors Comuns i Consells

  • Oblidar pure: Recorda que pure encapsula un valor en un context.
  • Confusió amb fmap: fmap aplica una funció a un valor encapsulat, mentre que (<*>) aplica una funció encapsulada a un valor encapsulat.
  • Seqüenciació: Utilitza (*>) i <* per seqüenciar accions quan no necessites el resultat d'una d'elles.

Resum

Els funtors aplicatius són una eina poderosa per treballar amb contextos en Haskell. Permeten aplicar funcions encapsulades a valors encapsulats, proporcionant una manera elegant de gestionar efectes i contextos. Amb la pràctica, esdevenen una part essencial del teu arsenal de programació funcional.

© Copyright 2024. Tots els drets reservats