アクションを評価IO
しても何も起こりません。それは正しい!
必要に応じて、型の値IO
は単なる「命令リスト」です。したがって、アクションが実際に使用された場合に行うべきことをseq
プログラムに確認させるだけです。そして、アクションを使用することは評価とは何の関係もありません。それは、それを呼び出しにモナド的にバインドすることを意味します。しかし、あなたが言うように、は非モナド署名を持つ関数であるため、ここでは起こり得ません。main
someFunction
あなたができること...しかししないことは、
import Foreign
someFunction x = unsafePerformIO (print x) `seq` 1
これは実際に評価をIO
実行に結び付けます。通常、これは Haskell では非常に悪い考えです。評価は完全に予測不可能な順序で発生する可能性があり、(コンパイラが参照透過性を想定しているため) 想定とは異なる回数になる可能性があるためです。
正しい解決策は、署名をモナドに変更することです。
someFunction :: Int -> IO Int
someFunction x = do
print x
return 1
main = do
y <- someFunction "test"
print y
1そしてたまたま、このプログラムは、 がなくても可能な限り確実ですseq
。これ以上の詳細は、アクションを実行することによってのみ取得できます。