我真的想要一个简单的解释。 我有一大堆函数,其中一个列表推导表现得非常奇怪。
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
有人能提供任何建议吗?
答案 0 :(得分: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]
所以你要写全部10个,用8个覆盖它们,然后用7s再次覆盖它们。
正如luqui在评论中所建议的那样,试试这个:
sequence_ [writeArray arr (x, y) a | (x, a) <- (zip xs as)]
where xs = [1,3,2]
as = ["10", "8", "7"]