Sono un paio di settimane da dilettarsi con haskell e ho fatto una bella ammaccatura in Learn You A Haskell. Mi sento come se molte delle classi di tipi e le implementazioni comuni fino agli applicativi e alle monadi abbiano molto senso per me e capisco come funzionano, ma mi manca ancora molta esperienza pratica.
Una cosa che mi infastidisce, derivante da uno sfondo prevalentemente imperativo / OOP, è il concetto di valori / funzioni che valutano le liste infinite. Ovviamente posso vedere come possono essere usati per scrivere alcune definizioni in modo molto teso e sono sicuramente utili in molti casi che non riesco nemmeno a immaginare. Mi chiedo quale sia l'approccio comune per mitigare i loro rischi. Se in qualsiasi punto del tuo codice valuta casualmente un elenco infinito "completamente", il tuo programma si bloccherà. Questo è possibile anche nelle lingue imperative (alcune implementazioni delle interfacce IEnumerable
/ Iterator
da C # / Java per esempio), ma è la mia esperienza che le persone raramente fanno questo perché è ... beh, pericoloso.
Uno dei grandi vantaggi di Haskell è il controllo dei tempi di compilazione. Possiamo fare controlli sulla compilazione per gestire questo rischio? O scriviamo test per questo? O siamo semplicemente "mai così stupidi da farlo, e se lo facciamo, lo notiamo dopo 1 secondo quando lo eseguiamo nel REPL"? O ci sono convenzioni di denominazione?
Mi rendo conto che probabilmente è un po 'soggettivo, ma sicuramente esistono idiomi comuni?