Haskell中的双列表理解

pre*_*non 3 haskell list-comprehension list

我正在尝试将数组实现为Haskell中的列表列表.特别是,我有一些m我给出的数组,以及一个p我想要满足的谓词,我想创建一个索引列表,(x,y)使得该列表的x第th个元素y满足p.我把它设置为以下列表理解:

[(x,y) | x<-[1..],y<-[1..],p ((m !! y) !! x)]  
Run Code Online (Sandbox Code Playgroud)

当它试图m在第一行中找到不存在的元素时会引发错误.我可以看到一个立即解决这个问题的方法就是改变内在的理解xy类似的东西,y<-[1..length m]但我觉得有一种可行的方法可以利用懒惰.我只是不知道它是什么.

Ørj*_*sen 6

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

[(x,y) | (x,mx) <- zip [1..] m, (y,mxy) <- zip [1..] mx, p mxy]
Run Code Online (Sandbox Code Playgroud)

也:

  • !! 是非常低效的,特别是从列表中提取许多元素时,所以最好尽可能避免使用它.
  • 列表索引通常以0Haskell 开头.

  • @DanielLittlewood请记住,Haskell列表是**链接**结构.操作`xs !! n`需要走'n`链接才能获得元素.这与大多数命令式语言中通常的数组索引相反,它需要O(1)操作. (4认同)