From the chapter on Functors in Learn You a Haskell for Great Good, Lipovača afferma:
"Quando facciamo
(+) <$> (+3) <*> (*100)
, stiamo facendo una funzione che utilizzerà+
su i risultati di(+3)
e(*100)
e restituiscono questo. per dimostrare su un vero e proprio esempio, quando abbiamo fatto(+) <$> (+3) <*> (*100) $ 5
, il5
arrivati applicato a(+3)
e(*100)
, con conseguente8
e500
. Poi,+
viene chiamato con8
e500
, res ulting in508
. "
Tuttavia, se provo a valutare la funzione me stesso, considerando questa definizione per applicativo sul funtore ((->) r):
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
ho letto la valutazione della espressione di cui sopra come:
(\x -> (3 + x) (100 * x)) $ 5
Ma non vedo come si possa comporre due funzioni binarie parzialmente applicate come una singola lambda (in realtà, GHCi genera un errore di tipo infinito tentativo di legare questo a una variabile). Inoltre, ad un'interpretazione lavorare, se consideriamo la definizione tipo per <$>
otteniamo:
(<$>) :: Functor f => (a -> b) -> f a -> f b
o più specificamente possiamo osservare suo sollevamento come:
(<$>) :: Functor f => (a -> b) -> (f a -> f b)
Considerando che il nostro funtore in questo caso è ((->) r), posso dedurre che questo è ciò che la trasformazione ha luogo nella valutazione precedente (supponendo che l'associatività sinistra avvenga per prima, invece della giusta applicazione associativa di 5
):
(\x -> a + b)
dove a
= (+ 3)
e b
= (* 100)
. Questa è la funzione che dovrebbe essere restituita. Tuttavia, ho ragione nel ritenere che questa sia la forma finale (approssimativa)?
(\x -> (3 + x) + (100 * x)) $ 5
... che produce 508.
trovo descrizione di Lipovača più comprensibile in termini di come funziona l'espressione, ma il mio istinto mi dice non è del tutto vero per i dettagli Gorey sotto la Cappuccio del compilatore Haskell. È più facile per me pensare che la fmap di (+) abbia avuto come prima conseguenza una funzione con due funtori che sono parzialmente applicate a funzioni che prendono un input condiviso, e quindi abbiamo applicato un valore ad esso. Possiamo farlo a causa di una valutazione pigra. È sbagliato?
"ho letto la valutazione della espressione di cui sopra come:' (\ x -> (3 + x) (100 * x)) $ 5' ". Suggerimento: la tua valutazione manca il '((+) <$>)', ergo l'errore di tipo. – duplode
Sì, è per questo che continuo a includere nella seconda metà. – RJS
Oops - non importa, avevo letto male la parte centrale della domanda. – duplode