Sto solo imparando Haskell e IO monadi. Mi chiedo perché non avrebbe questa forza al programma di uscita "hi" e "bye":Perché Haskell non può essere indotto a eseguire operazioni di I/O utilizzando una valutazione rigorosa?
second a b = b
main = print ((second $! ((print "hi") >>= (\r -> return()))) "bye")
Per quanto ho capito, l'operatore $!
costringerebbe il primo argomento di second
da valutare e l'operatore >>=
dovrebbe eseguire print "hi"
per ottenere un valore da esso e passarlo a \r -> return()
, che stamperebbe "ciao" allo schermo.
Cosa c'è di sbagliato nel mio ragionamento?
E inoltre, esiste un modo per dimostrare che Haskell non può essere ingannato (oltre all'uso di funzioni non sicure) nell'esecuzione di operazioni IO all'interno di codice "sicuro"?
BTW, il tuo codice può essere semplificato in 'main = print (stampa" hi "\' seq \ '" ciao ")' –
Risposta: Perché non puoi ingannare Haskell. –