コード内で数回使用される haskell の nullary 関数があるとします。常に一度だけ評価されますか?私はすでに次のコードをテストしました:
sayHello :: Int
sayHello = unsafePerformIO $ do
putStr "Hello"
return 42
test :: Int -> [Int]
test 0 = []
test n = (sayHello:(test (n-1)))
テスト 10 を呼び出すと、"Hello" が 1 回だけ書き込まれるため、最初の評価後に関数の結果が格納されていることを示しています。私の質問は、それは保証されていますか? 異なるコンパイラで同じ結果が得られますか?
編集 unsafePerformIO を使用した理由は、sayHello が複数回評価されるかどうかを確認するためです。私のプログラムではそれを使用しません。通常、私は sayHello が評価されるたびにまったく同じ結果になることを期待しています。しかし、これは時間のかかる操作なので、この方法でアクセスできるかどうか、または複数回評価されないようにするために必要な場合はいつでも引数として渡す必要があるかどうかを知りたかったのです。
test _ 0 = []
test s n = (s:(test (n-1)))
...
test sayHello 10
答えによると、これを使用する必要があります。