Dire che ho un tipo di dati A
che è applicabile. (Per l'esempio, possiamo supporre che A
sia Identity
).Istanza applicativa per funzioni dallo stesso dominio a Applicativo
ora ho un nuovo tipo di dati che corrisponde alla "trasformazione" da un A
all'altro:
data B a b = B (A a -> A b)
voglio definire l'istanza applicativo banale per (B a)
che produce una nuova trasformazione che si applica entrambi gli argomenti di <*>
al suo ingresso e poi utilizza la definizione di < *> dall'istanza applicativo di A.
formulazione di questo è abbastanza semplice:
instance Applicative (B a) where
pure x = B $ const $ pure x
(B ftrans) <*> (B xtrans) = B fxtrans
where fxtrans inp = let fout = ftrans inp
xout = xtrans inp
in fout <*> xout
Tuttavia, ho la sensazione che ci dovrebbe essere un modo semplice di scrivere in pointfree scrivendo il fatto che (-> a)
è un Functional Applicativo.
Come un esempio di quello che ho in mente, prendere in considerazione la mia definizione del corrispondente istanza Functor:
instance Functor (B a) where
fmap f (B xtrans) = B $ (fmap f) <$> xtrans
Esiste un modo altrettanto semplice per definire l'istanza applicativo?
Sarebbe corretto dire che 'B a b' nella domanda è equivalente a' tipo B a = Componi ((->) (A a)) A'? –
@ChristianConkle: Sì. –