Ho giocato con le istanze Applicative
per capire come funzionano. Tuttavia, onestamente non capisco questo comportamento.In che modo GHCi stampa i valori parzialmente applicati creati da "puro"?
Se si definisce il proprio tipo di dati, quindi applicare pure
ad esso senza altri argomenti, non viene stampato nulla, ma si verifica un errore se si tenta di applicare qualcosa al risultato.
ghci> data T = A
ghci> pure A
ghci> pure A 0
<interactive>:21:1:
No instance for (Show T) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Tuttavia, se faccio T
un'istanza di Show
, poi A
viene stampato in entrambi i casi.
ghci> data T = A deriving (Show)
ghci> pure A
A
ghci> pure A 0
A
Quello che davvero non capisco è come pure A
può essere un valore che viene stampato in modo diverso tra i due casi. pure A
non viene applicato parzialmente?
Capisco perché chiamare gli errori pure A 0
nel primo esempio e non nel secondo, ha senso per me. Si sta utilizzando l'istanza ((->) r)
di Applicative
, quindi restituisce semplicemente una funzione che restituisce sempre A
.
Ma in che modo è pure
istanziato con un solo valore quando il tipo dell'applicativo stesso non è ancora noto? Inoltre, come può GHC stampare questo valore?
Perché proprio "IO"? È solo un default arbitrario? –
@AlexisKing, è un valore predefinito per il tipo di sviluppo interattivo che le persone tendono a fare con GHCi. Non vi è alcun 'main' in GHCi, e sarebbe fastidioso dover invocare qualche comando di interprete speciale per eseguire un'azione' IO'. – dfeuer
Con azioni 'IO' e solo azioni' IO', * le esegue * oltre a valutare, quindi devono essere trattate in modo speciale. Il fatto che anche le azioni generiche di "Applicative/Monad" siano predefinite è probabilmente solo un bell'effetto collaterale, anche se è esplicitamente menzionato nel manuale. –