2016-08-14 79 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