2010-03-10 4 views
4

Pouvez-vous créer une liste de fonctions, puis les exécuter séquentiellement, en les passant peut-être en notation Do?Pouvez-vous transformer une liste Haskell en une série d'instructions?

Je fais actuellement cela en mappant sur une liste de données et je me demande si je peux appeler en quelque sorte passer le résultat comme une série d'appels séquentiels?

+2

phrase ce que vous voulez faire en tant que signature de type et branchez-le Hoogle: http://www.haskell.org/hoogle/ – jberryman

Répondre

9

Quelque chose comme ça?

sequence [putStrLn "Hello", putStrLn "World"] 
+1

Oui , et OP devrait probablement envisager de lire la documentation Haddock de la base. Notez les fonctions mapM, mapM_, sequence et sequence_ font ce qu'il veut d'une façon ou d'une autre. –

5

Si ce sont des fonctions, à savoir pur, vous pouvez utiliser ($) ou « appliquer »:

execute functions argument = map ($argument) functions 
-- execute [id,(1+),(1-)] 12 => [12,13,-11] 

Il n'y a aucune garantie que cela se produit en séquence bien sûr, mais vous obtiendrez une liste de les valeurs de retour.

Si ce sont des actions, soit impur, alors ce que vous voulez est appelé sequence_:

sequence_ [putStr "Hello", putStr " world", putStrLn "!"] 

sequence_ est assez facile de vous écrire:

sequence_ [] = return() 
sequence_ (action:actions) = action >> sequence_ actions 

Il y a aussi un sequence (sans souligner) qui exécute un tas d'actions et renvoie leurs résultats:

main = do 
    ss <- sequence [readFile "foo.txt", readFile "bar.txt", readFile "baz.txt"] 
    -- or ss <- mapM readFile ["foo.txt", "bar.txt", "baz.txt"] 
+1

Nitpick: les "actions", alias valeurs monadiques, ne sont pas nécessairement impures. Exemples: listes, valeurs dans la monade d'état, valeurs dans la monade de continuation ... –

+0

Nitpickpick: vous pouvez appeler une monade une façon de spécifier ce que vous entendez par "impur"; c'est-à-dire les effets secondaires que vous permettez à votre code d'avoir. – luqui

3

bonnes réponses à ce jour, mais si vous voulez aussi chaque fonction d'agir non sur les données d'origine, mais sur le résultat de la fonction précédente, regardez les fonctions de foldding, comme foldl, foldl1 et foldr:

fns = [(1-), (+2), (abs), (+1)] 
helperFunction a f = f a 
test1 n = foldl helperFunction n fns 

et vous devrez peut-être la version monadique, foldM et foldM_:

import Control.Monad 
import Data.Char 

helperFunction a f = f a 
prnt = \s-> do putStrLn s; return s 
actions = [return, prnt, return.reverse, prnt, return.(map toUpper), prnt, return.reverse, prnt] 
test2 str = foldM_ helperFunction str actions 
Questions connexes