Mas*_*tic 0 haskell functional-programming callback immutability
我正在使用一个C函数,我将一个(回调)函数传递给它,并且每次使用不同的参数调用它.
我将它导入Haskell,现在我有类似的东西(我当然简化了它):
countToFive :: (Int -> IO ()) -> IO ()
countToFive fn = do fn 1; fn 2; fn 3; fn 4; fn 5
Run Code Online (Sandbox Code Playgroud)
我想列出传递给的每个号码fn; 有这个签名的东西:
counting :: IO [Int]
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,将(当然执行IO)的结果[1,2,3,4,5].
命令式方法counting是创建一个可变列表,并countToFive使用一个函数调用,该函数在每次调用时将参数插入到可变列表中,然后返回列表.
什么是功能性的方法呢?
你这样做的方式完全一样 - 一旦你在IOmonad中生活得如此深刻,很多事情都会像它的表兄弟一样感受到很多.
import Data.IORef
counting :: ((Int -> IO ()) -> IO ()) -> IO [Int]
counting fun = do
store <- newIORef []
fun (\new -> modifyIORef store (new:))
readIORef store
Run Code Online (Sandbox Code Playgroud)
注意使用相当高阶的函数类型来参数化类型的counting函数countToFive.对于更加令人难以置信的体验,有趣的是,这种方法与"延续传递风格"是一致的.在一个非常真实的意义上,countToFive"包含"一个整数列表,只是有一个"把它拿出来"的棘手方法.