2017-06-29 4 views
1

Dans Haskell, comment écrire sur un nombre de fichiers arbitrairement grand?Écrire dans plusieurs fichiers dans Haskell

À titre d'exemple, disons que je veux prendre les lettres a à z et les mettre dans des fichiers nommés pour la lettre de leur contenu. Une première tentative a été de faire ce qui suit:

main :: IO() 
main = do 
     let letter = map (:"") ['a'..'z'] 
     zipWith writeFile letter letter 

qui a produit l'erreur suivante:

Couldn't match expected type 'IO()' with actual type '[IO()]'

Je me sens comme il devrait y avoir un moyen de boucle à travers une liste dans un bloc do, mais je havre de paix pas pu le trouver encore.

+0

Peut-être pourriez-vous plier votre 'zipWith' avec des actions factices pour que vous obteniez le bon type? – bli

+0

@bli La chose avec laquelle je me bats ici est que je veux que le type soit '[IO()]' puisque je veux effectuer plusieurs actions d'E/S. Je pense qu'il devrait y avoir un moyen pour le bloc do d'accepter une liste, ou de l'aplatir pour moi. – martin

Répondre

2

La fonction dont vous avez besoin est zipWithM.

Re. way to loop through a list in a do block, il ya aussi une fonction pour cela - sequence, de sorte que vous pouvez écrire sequence $ zipWith writeFile letter letter.

+0

J'ai aussi dû changer le type de main en 'main :: IO [()]', mais ça l'a fait pour moi. Merci. – martin

+1

@martin C'est une option, bien qu'il soit plus courant de laisser 'main :: IO()' et d'ajouter 'return()' comme dernière entrée dans le bloc 'do', après la ligne' zipWithM'. – chi

+0

@chi bon à savoir, merci. – martin