当我在阅读SDL
haskell的文档时,我发现一些函数不可避免地会修改它的输入。例如,blitSurface
将目标表面作为输入,但在函数内更新。现在,概括问题,如果我有一个函数f :: a -> IO a
,如果我在函数内部修改它会破坏组合a
吗?怎么样f :: IO a -> IO a
?怎么样a -> IO ()
?那么IO a -> IO ()
呢?
考虑到blitSurface
实际上是一个外来函数的情况,并且每帧制作一个新曲面听起来效率不高,这些函数是难以避免的。这样的功能会导致更大范围的问题吗?例如,以fModifySurface :: Surface -> IO ()
which does 破坏性更新为例:
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
上面的代码中是否有任何意想不到的语义?如果是这样,利用改变输入的外部函数的最佳方法是什么?