2009-08-17 10 views
9

Quelle est la manière haskell de faire cela?boucle à travers deux variable dans Haskell

for (int i = 0 ; i < 1000 ; i++) 
     for (int j = 0 ; j < 1000 ; j++) 
       ret = foo(i , j)   #I need the return value. 

Plus fond: Je résous euler problem 27, et j'ai:

value a b = 
    let l = length $ takeWhile (isPrime) $ map (\n->n^2 + a * n + b) [0..] 
    in (l, a ,b) 

L'étape suivante est d'obtenir une liste de tuple par une boucle à travers tous les possibles a et b puis faire le traitement suivant:

foldl (\(max,v) (n,a,b)-> if n > max then (n , a * b) else (max ,v)) (0,0) tuple_list 

mais je n'ai aucune idée comment faire une boucle à travers deux variables .. Merci.

Répondre

24

Utilisez une compréhension de liste imbriquée. Ici, 'foo' est '(,)' ':

[ (i,j) | i <- [0 .. 999], j <- [0 .. 999] ] 

Ou aménagé pour rendre l'imbrication plus claire:

[ foo i j 
| i <- [0 .. 999] 
, j <- [0 .. 999] 
] 
+1

cette seule réponse vient de faire tellement de choses cliquent dans ma petite tête de haskell, merci –

14

ainsi que la réponse de dons, vous pouvez utiliser la liste monade:

do 
    i <- [0 .. 999] 
    j <- [0 .. 999] 
    return (foo i j) 
8

Vous pouvez aussi le faire en utilisant bien Control.Applicative

module Main where 

import Control.Applicative 

main :: IO() 
main = mapM_ putStrLn (foo <$> [0..3] <*> [0..3]) 

foo :: Int -> Int -> String 
foo a b = "foo " ++ show a ++ " " ++ show b 

Exemple d'exécution:

C:\programming>ghc --make Main.hs 
[1 of 1] Compiling Main    (Main.hs, Main.o) 
Linking Main.exe ... 

C:\programming>main 
foo 0 0 
foo 0 1 
foo 0 2 
foo 0 3 
foo 1 0 
foo 1 1 
foo 1 2 
foo 1 3 
foo 2 0 
foo 2 1 
foo 2 2 
foo 2 3 
foo 3 0 
foo 3 1 
foo 3 2 
foo 3 3