2016-08-14 4 views
0

ich habe:Haskell: Monade Stack binden mit IO und []

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

und ich möchte

stuff >>= doThings 

aber meine Typen sind aus. Ich möchte im Wesentlichen eine aufgehobene Bindung machen, aber alles, was ich versuche, ist subtil falsch.

+5

'do xs <- stuff; mapM_ doThings xs'? Was genau versuchst du zu tun? Auch: '[()]' ist ein ziemlich nutzloser Typ. Ist ein 'Int' nicht genug? Oder kannst du nicht einfach den Typ 'String -> IO()' haben? – Bakuriu

+0

Danke! Ich habe '[()]' in '()' geändert und 'mapM_' verwendet, es hat super funktioniert! –

+2

Sie können '[()]' beibehalten (vorausgesetzt, Sie haben einen Grund, dies zu wollen), indem Sie 'mapM' verwenden. Beachten Sie, dass das abschließende '_' in Haskell normalerweise" Ignoriere das Ergebnis (die Ergebnisse) "bedeutet. –

Antwort

1

mit Ihrem ursprünglichen Typen können Sie tun:

stuff >>= mapM_ doThings 

Dies funktioniert auch, wenn Sie doThings Typ doThings :: String -> IO()

0

haben ändern Wenn Sie viele solche Funktionen haben, das ist das Lehrbuch usecase von ListT:

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