Quando si cerca di imparare Haskell, una delle difficoltà che si presentano è l'abilità quando qualcosa richiede una magia speciale dal compilatore. Un esempio che viene in mente è la funzione seq
che non può essere definita, ad esempio non è possibile creare una funzione seq2
che si comporti esattamente come seq
integrata. Di conseguenza, quando si insegna a qualcuno su seq
, è necessario ricordare che lo seq
è speciale perché è un simbolo speciale per il compilatore.Magia del compilatore Haskell: cosa richiede un trattamento speciale dal compilatore?
Un altro esempio potrebbe essere la do
-notazione che funziona solo con le istanze della classe Monad
.
A volte, non è sempre ovvio. Ad esempio, continuazioni. Il compilatore sa di Control.Monad.Cont
o è semplicemente la vecchia Haskell che avresti potuto inventarti? In questo caso, penso che dal compilatore non sia richiesto nulla di speciale, anche se le continuazioni sono un tipo di bestia molto strano.
Le estensioni di lingua mettono da parte, di quali altri compilatori di magia dovrebbero essere a conoscenza gli studenti di Haskell?
Dichiarare l'ovvio: qualsiasi cosa 'IO' ricada sotto" magia "per qualsiasi ragionevole definizione di" magia ": https://www.reddit.com/r/haskell/comments/450baq/is_it_just_me_or_does_ios_definition_give_you_the/. Anche la monade 'ST', che probabilmente è ancora più magica. – PyRulez
Che mi dici di STM? E fusione di corrente? – gawi
sì anche quelli, ma STM ottiene la sua magia da IO, e la fusione di vapore è regole di riscrittura, che è di per sé magica. – PyRulez