Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Haskell版本的双循环_Loops_Haskell_Functional Programming_Duplicates_Iteration - Fatal编程技术网

Loops Haskell版本的双循环

Loops Haskell版本的双循环,loops,haskell,functional-programming,duplicates,iteration,Loops,Haskell,Functional Programming,Duplicates,Iteration,我需要在Haskell中执行以下操作,但想不出正确的方法: for (int i=0; i<100; i++) for (int a=0; a<100; a++) foo = (i, a); 我也不希望返回“副本”,所以不同时返回1,50和50,1。有什么办法吗 您可以使用列表理解: foo::[Int,Int] foo=[i,a | i首先,如果你不想要重复,你可以添加约束i如果你不想要重复,那么循环实际上是: forint i=0;i

我需要在Haskell中执行以下操作,但想不出正确的方法:

for (int i=0; i<100; i++)
  for (int a=0; a<100; a++)
     foo = (i, a);

我也不希望返回“副本”,所以不同时返回1,50和50,1。有什么办法吗

您可以使用列表理解:

foo::[Int,Int]
foo=[i,a | i首先,如果你不想要重复,你可以添加约束i如果你不想要重复,那么循环实际上是:

forint i=0;i<100;i++ forint j=i;j<100;j++ 某物i,j; 可以制成Haskell的任何一种

-- raw binds
[0..99] >>= \i ->
  [i..99] >>= \j ->
    return $ something i j

-- do-notation
do i <- [0..99]
   j <- [i..99]
   return $ something i j

-- list comprehension
[ something i j | i <- [0..99], j <- [i..99]]

您也可以使用应用函子,只需这样做

Prelude> (,) <$> [0..2] <*> [0..3]
[(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3)]

不删除重复项。你必须使用单子来代替…或者事后修复,即过滤uncurry@leftaroundaounda关于是的,这是可能的,但我想这会有点浪费。我猜这种方法不适合给定的情况。这是我的疏忽。我看到你已经对你的问题有了一些答案,但请确保你如何尝试下一次你如何尝试自己解决这个问题-这不是我们为你解决haskell家庭作业的网站,而是一个我们帮助你自己解决问题的网站,确保你在发布一个问题上投入的精力至少与别人期望回答的一样多循环是不必要的,因为你一直在覆盖foo:foo=99,99本身也会产生同样的结果。注意比较的方向
Prelude> [(i,a) | i <- [0..6], a <- [i..6]]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(2,2),(2,3),(2,4),(2,5),(2,6),(3,3),(3,4),(3,5),(3,6),(4,4),(4,5),(4,6),(5,5),(5,6),(6,6)]
-- raw binds
[0..99] >>= \i ->
  [i..99] >>= \j ->
    return $ something i j

-- do-notation
do i <- [0..99]
   j <- [i..99]
   return $ something i j

-- list comprehension
[ something i j | i <- [0..99], j <- [i..99]]
Prelude> (,) <$> [0..2] <*> [0..3]
[(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3)]