2015-06-20 66 views
4

我只是想要一个简单的解释,真的。 我有一大堆功能,我的一个列表解析行为非常奇怪。我很难与列表理解

sequence_ [writeArray arr (x, y) a | x <- xs, a <- as] 
    where xs = [1,3,2] 
    as = ["10", "8", "7"] 

y是恒定的(传递作为参数),我已经切出了很多其他功能,因为他们回来我所期待的。

如果我有一个数组,看起来像

1,1,1 
1,1,1 
1,1,1 

我希望得到(例如)

1,1,10 
1,1,8 
1,1,7 

而是我得到

1,1,7 
1,1,7 
1,1,7 

是任何人都能够提供有什么建议?

+2

在你的列表中理解你不使用'了'。不确定你想要做什么,但看起来不正确。 –

+0

我的错误,我打错了。现在修复。 –

+6

列表理解中的多个绑定(< - )的行为类似于嵌套循环,而不是并行。你想使用'zip' – luqui

回答

6

在两个变量列表理解不超过两个变量同时迭代,但是独立(你绑定值的所有组合):

Prelude> [(x, y) | x <- [0..3], y <- [4..6]] 
[(0,4),(0,5),(0,6),(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 

您因此被测序以下操作:

sequence_ [writeArray arr (1, y) 10, 
      writeArray arr (3, y) 10, 
      writeArray arr (2, y) 10, 
      writeArray arr (1, y) 8, 
      writeArray arr (3, y) 8, 
      writeArray arr (2, y) 8, 
      writeArray arr (1, y) 7, 
      writeArray arr (3, y) 7, 
      writeArray arr (2, y) 7] 

所以你写了所有的10s,用8s覆盖它们,然后用7s重写它们。

由于luqui在评论建议,试试这个来代替:

sequence_ [writeArray arr (x, y) a | (x, a) <- (zip xs as)] 
    where xs = [1,3,2] 
    as = ["10", "8", "7"] 
+0

谢谢,我刚刚解决了这个问题,luqui在谈论什么时候突然出现了! –