Supponiamo di avere una funzione null in haskell, che viene usata più volte nel codice. Viene sempre valutato solo una volta? Ho già provato il seguente codice:Valutazione delle funzioni nulle in Haskell
sayHello :: Int
sayHello = unsafePerformIO $ do
putStr "Hello"
return 42
test :: Int -> [Int]
test 0 = []
test n = (sayHello:(test (n-1)))
Quando chiamo prova 10, scrive "Ciao" ony una volta, quindi è che indica il risultato della funzione viene memorizzato dopo la prima valutazione. La mia domanda è, è garantita? Otterrò lo stesso risultato su diversi compilatori?
Modifica Il motivo per cui ho usato unsafePerformIO è per verificare se sayHello viene valutato più di una volta. Non lo uso nel mio programma. Normalmente mi aspetto che Hello abbia lo stesso risultato ogni volta che viene valutato. Ma è un'operazione che richiede tempo, così ho voluto sapere se è stato possibile accedere in questo modo, o se deve essere passato come argomento dovunque ce n'è bisogno per assicurarsi che non viene valutato più volte, vale a dire:
test _ 0 = []
test s n = (s:(test (n-1)))
...
test sayHello 10
Secondo le risposte dovrebbe essere usato.