假設您在haskell中有一個無用函數,它在代碼中多次使用。它總是隻評估一次?我已經測試了以下代碼:Haskell中空函數的評估
sayHello :: Int
sayHello = unsafePerformIO $ do
putStr "Hello"
return 42
test :: Int -> [Int]
test 0 = []
test n = (sayHello:(test (n-1)))
當我打電話測試10,它寫道:「你好」 ONY一次,所以它表示第一次評估之後,存儲功能的結果。我的問題是,它有保證嗎?我會在不同的編譯器中得到相同的結果嗎?
編輯 我使用unsafePerformIO的原因是爲了檢查sayHello是否被多次評估。我不會在我的程序中使用它。通常我希望sayHello在每次評估時都有完全相同的結果。但它是一個耗時的操作,所以我想知道這是否可以訪問這種方式,或者如果它應該徘徊無論它以確保它不會多次評估真實需要一個參數,即傳遞:
test _ 0 = []
test s n = (s:(test (n-1)))
...
test sayHello 10
根據這個答案應該使用。