Haskell: [IO ()] to IO ()



Haskell维基有以下问题:

https://en.wikibooks.org/wiki/Haskell/Higher-order_functions for :: a -> (a -> Bool) -> (a -> a) -> (a -> IO ()) -> IO () for i p f job = -- ???

我能够提出以下实现:

generate :: a -> (a->Bool) -> (a->a) -> [a]
generate s cnd incr = if (cnd s) then [] else [s] ++ generate (incr s) cnd incr
-- collapse :: [IO ()] -> IO ()
-- collapse (x:xs) = x ++ collapse xs
-- does not work ^^^^^^

for::a->(a->Bool)->(a->a)->(a->IO())->IO()
for s cnd incr ioFn = map (ioFn) (generate s cnd incr)

当然,map (ioFn) (generate s cnd incr)的结果是[IO ()].我不确定如何将其转换为IO ()我需要类似foldl的东西,但可以使用[IO ()]而不是[a].

您要查找的函数是:

sequence_ :: (Foldable t, Monad m) =>t (m a) ->m ()

但是我们实际上可以 替换map,这样我们就不需要额外的功能。您可以在此处使用mapM_ :: Monad m => (a -> m b) -> [a] -> m ()而不是map,因此:

for :: a -> (a -> Bool) -> (a -> a) -> (a -> IO ()) -> IO()
for s cnd incr ioFn =mapM_ioFn (generate s cnd incr)

因此,这将在generate s cnd incr的所有元素上应用函数ioFun,并最终返回单位()

最新更新