10

これを行うための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

しかし、2つの変数をループする方法がわかりません..ありがとう。

4

3 に答える 3

24

ネストされたリスト内包表記を使用します。ここで「foo」は「(,)」です。

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

または、入れ子をより明確にするためにレイアウトします。

[ foo i j
| i <- [0 .. 999]
, j <- [0 .. 999]
]
于 2009-08-17T06:03:41.070 に答える
14

ドンの答えと同様に、リストモナドを使用できます:

do 
  i <- [0 .. 999]
  j <- [0 .. 999]
  return (foo i j)
于 2009-08-17T11:25:53.667 に答える
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
于 2009-08-18T23:41:52.597 に答える