bind
函数 ( )>>=
具有签名:
m a -> (a -> m b) -> m b
但是,我想要一个带有签名的函数:
m (t a) -> (a -> m (t b)) -> m (t b)
具体来说,我有一个给定整数的函数,它返回 IO 中的整数列表:
f :: Int -> IO [Int]
但我想将它应用到一个IO of list of Integers
并且我不能使用常规绑定函数,因为它被包装在两个容器中,即包含在 IO 中的列表。在hoogle上搜索没有帮助。
我正在使用以下方法来实现这一点:
假设函数的实现是:
f :: Int -> IO [Int]
f x = do
return $ [x-10, x+10]
我正在使用两个辅助函数来获得我想要的东西:
f' :: [Int] -> IO [Int]
f' xs = do
list <- traverse f xs
return $ join list
f'' :: IO [Int] -> IO [Int]
f'' xs = do
ys <- xs
f' ys
以上工作,但我想知道是否有更好/惯用的方法来实现这个在haskell?