Haskell 中的双重列表理解

Double List Comprehension in Haskell

我正在尝试将数组实现为 Haskell 中的列表列表。特别是,我有一些给定的数组 m 和一个我想要满足的谓词 p,我想创建一个索引列表 (x,y) 这样第 y 个列表的第 x 个元素满足 p。我将其设置为以下列表理解:

[(x,y) | x<-[1..],y<-[1..],p ((m !! y) !! x)]  

当它试图在第一行中找到不存在的 m 元素时会抛出错误。我可以看到解决此问题的一种直接方法是将 xy 的内部理解更改为 y<-[1..length m] 之类的东西,但我觉得有一种更可爱的方法可以利用懒惰。我只是不知道它是什么。

确实有。获取列表元素及其索引的常用习惯是使用 zip:

[(x,y) | (x,mx) <- zip [1..] m, (y,mxy) <- zip [1..] mx, p mxy]

另外:

  • !!效率很低,尤其是从列表中提取很多元素时,所以最好尽量避免。
  • 列表索引通常以 0 in Haskell 开头。