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]
的函数。
generate s cnd incr = takeWhile cnd (iterate incr s)
- 4castle[IO ()]
是[a]
的一个更具体的实例(其中a
为IO ()
),因此您可以将其传递给foldl
。另外,您可以在https://hoogle.haskell.org/?hoogle=%5BIO%20()%5D%20-%3E%20IO%20()&scope=set%3Ahaskell-platform上提出这种类型的问题。 - jberrymansequence_
,你可以直接使用例如foldr (*>) (pure ())
(或者foldr (>>) (return ())
)来编写这个函数。这基本上就是sequence
/sequence_
/sequenceA
的实现方式:使用 applicative/monadic sequencing (*>
/>>
) 来连接这些操作,而“base case”则是一个什么都不做的操作 (pure ()
/return ()
)。 - Jon Purdy