in haskellのドキュメントを読んでいるとSDL
、一部の関数が必然的にその入力を変更することがわかりました。たとえば、blitSurface
入力としてデスティネーション サーフェスがありますが、関数内で更新されます。さて、問題を一般化すると、関数がある場合、関数内でf :: a -> IO a
変更すると構成が壊れa
ますか? どうf :: IO a -> IO a
ですか?どうa -> IO ()
ですか?そしてどうIO a -> IO ()
ですか?
blitSurface
が実際には外部関数であり、フレームごとに新しいサーフェスを作成するのはあまり効率的ではないことを考えると、これらの関数を避けるのは困難です。そのような関数は、より大きなスケールで問題を引き起こしますか? たとえば、fModifySurface :: Surface -> IO ()
破壊的な更新を行う which を例として使用すると、次のようになります。
main = do
w <- ... -- The window surface
-- Do something here
s <- someFuncGetSurface -- We get a surface here
fModifySurface s -- Destructively update s
blitSurface ...... -- Ignore the actual API, but destructively updates w
上記のコードに予期しないセマンティクスはありますか? もしそうなら、入力を変更する外部関数を利用する最良の方法は何ですか?