2009-08-17 5 views
9

Что такое способ haskell для этого?цикл через две переменные в Haskell

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

Больше фона: Я решении Эйлер problem 27, и я получил:

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

Следующий шаг, чтобы получить список кортежей проходом по всем возможным и б, а затем сделайте следующую обработку:

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

, но я понятия не имею, как пройти через две переменные. Спасибо.

ответ

24

Использование вложенного списка. Здесь 'Foo' является '(,)' ':

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

Или выкладывается, чтобы сделать гнездящихся понятнее:

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

этот единственный ответ только что сделал так много вещей, щелкнув в моей маленькой голове haskell, спасибо –

14

Как также ответ Донс', вы можете использовать список монады:

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

Вы также можете сделать это красиво, используя 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 

Пример:

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 

 Смежные вопросы

  • Нет связанных вопросов^_^