문제

Haskell은 이것을하는 방법은 무엇입니까?

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

더 많은 배경 : 나는 오일러를 해결하고 있습니다 문제 27 그리고 나는 가지고있다 :

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

다음 단계는 가능한 모든 A와 B를 루핑하여 튜플 목록을 얻은 다음 다음 처리를 수행하는 것입니다.

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

그러나 나는 두 가지 변수를 루프하는 방법을 모른다. 감사합니다.

도움이 되었습니까?

해결책

중첩 된 목록 이해력을 사용하십시오. 여기 'foo'는 '(,)' '입니다.

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

또는 둥지를 더 명확하게하기 위해 배치되었습니다.

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

다른 팁

Dons의 답변뿐만 아니라 Monad 목록을 사용할 수 있습니다.

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

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top