Haskell: от [IO ()] до IO () - PullRequest
       56

Haskell: от [IO ()] до IO ()

0 голосов
/ 24 октября 2018

Haskell wiki имеет следующий вопрос:

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)

Ofcourse map (ioFn) (generate s cnd incr) приводит к [IO ()].Я не уверен, как это можно преобразовать в IO () Мне нужно что-то вроде foldl, но тот, который работает с [IO ()] вместо [a].

1 Ответ

0 голосов
/ 24 октября 2018

Функция, которую вы ищете:

<b><a href="https://hackage.haskell.org/package/base-4.12.0.0/docs/Prelude.html#v:sequence_" rel="noreferrer">sequence_ :: (Foldable t, Monad m) => t (m a) -> m ()</a></b>

Но на самом деле мы можем просто заменить map, так что нам не нужна дополнительная функция.Вы можете использовать mapM_ :: Monad m => (a -> m b) -> [a] -> m () здесь вместо map, поэтому:

for :: a -> (a -> Bool) -> (a -> a) -> (a -> IO ()) -> IO()
for s cnd incr ioFn = <b>mapM_</b> ioFn (generate s cnd incr)

Таким образом, функция ioFun будет применена ко всем элементам generate s cnd incr, и в конечном итоге вернуть юнит ().

...