2009-08-17 16 views
9

¿Cuál es la forma de Haskell para hacer esto?bucle a través de dos variables en Haskell

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

Más de fondo: Yo soy la solución de Euler problem 27, y tengo:

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

El siguiente paso es obtener una lista de tuplas de bucle a través de todos los posibles A y B y luego hacer el siguiente procesamiento:

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

pero no tengo idea de cómo recorrer dos variables .. Gracias.

Respuesta

24

Usa una lista anidada de comprensión. Aquí 'foo' es '(,)' ':

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

o la disposición para hacer que la anidación más claro:

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

esta única respuesta acaba de hacer tantas cosas, haga clic en mi cabezal de haskell, gracias –

14

Así como respuesta Dons, puede utilizar la lista mónada:

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

también puede hacer esto muy bien usando 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 

Ejecución del ejemplo:

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