2016-08-14 29 views
0

我:哈斯克尔:与IO单子堆栈绑定和[]

stuff :: IO [String] 
doThings :: String -> IO [()] 

,我想

stuff >>= doThings 

,但我的类型了。我想本质上做一个提升的绑定,但我所尝试的一切都很微妙。

+5

'do xs < - stuff; mapM_ doThings xs'?你究竟想要做什么。另外:'[(()]'是一个非常无用的类型。是不是'足够'?或者你不能只有'String - > IO()'类型吗? – Bakuriu

+0

谢谢!我将'[()]'改成了'()'并使用了'mapM_',它效果很好! –

+2

你可以用'mapM'来保留'[(()]'(假设你有一些理由要这么做)。注意Haskell中尾部的'_'通常意味着“忽略结果”。 –

回答

1

有了您的原稿类型,你可以这样做:

stuff >>= mapM_ doThings 

此,如果你改变doThings有型doThings :: String -> IO()

0

如果你有很多这样的功能也适用,这是教科书用例ListT

main = runListT $ do 
    string <- ListT stuff 
    ListT $ doThings string