2009-08-17 16 views
9

Qual è il modo haskell per fare questo?attraverso due variabili in Haskell

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

più di fondo: sto risolvendo euler problem 27, e ho ottenuto:

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

Il passo successivo è quello di ottenere un elenco di tuple da loop attraverso tutte le possibili A e B e poi effettuare la seguente elaborazione:

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

ma non ho idea di come eseguire il ciclo di due variabili .. Grazie.

risposta

24

Utilizzare una comprensione di elenco nidificata. Qui 'foo' è '(,)' ':

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

o disposto a fare la nidificazione più chiaro:

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

questa singola risposta ha fatto appena tante cose clic nella mia piccola testa di haskell, grazie –

14

Così come risposta indossa', è possibile utilizzare l'elenco Monade:

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

Si può anche fare questo bene 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 

Esempio:

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