2009-08-17 12 views
9

Co to jest metoda haskell, aby to zrobić?Przejście przez dwie zmienne w Haskell

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

Więcej background: jestem rozwiązywania Euler problem 27 i mam:

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

Następnym krokiem jest uzyskanie listy krotki poprzez zapętlenie przez wszystkich możliwych A i B oraz następnie wykonaj następujące przetwarzanie:

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

, ale nie mam pojęcia, jak przechodzić przez dwie zmienne .. Dzięki.

Odpowiedz

24

Skorzystaj ze zrozumienia listy zagnieżdżonej. Tutaj 'foo' jest '(,)' ':

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

Albo rozplanowane, aby gniazdowania wyraźniej:

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

Ta pojedyncza odpowiedź spowodowała, że ​​tak wiele rzeczy kliknęło w moją małą główkę haskell, dzięki –

14

jak również odpowiedź Dons', można skorzystać z listy monady:

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

można też to zrobić ładnie użyciu 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 

Przykładowy przebieg:

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 
Powiązane problemy