loops - you - syntax record haskell
bucle a través de dos variables en Haskell (3)
¿Cuál es la manera de Haskell de hacer esto?
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 antecedentes: estoy resolviendo el problema 27 de euler, 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 recorriendo todo lo posible a y b y luego hacer el siguiente proceso:
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.
También puede hacerlo bien con 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 de 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
Además de la respuesta de dons, puedes usar la lista de mónadas:
do
i <- [0 .. 999]
j <- [0 .. 999]
return (foo i j)
Use una lista anidada de comprensión. Aquí ''foo'' es ''(,)'' '':
[ (i,j) | i <- [0 .. 999], j <- [0 .. 999] ]
O dispuesto para hacer el anidamiento más claro:
[ foo i j
| i <- [0 .. 999]
, j <- [0 .. 999]
]