如何在Haskell中实现列表推导?

ree*_*eem 6 monads haskell ghc

  • 列表推导只是一种语言特征吗?
  • 使用纯Haskell伪造列表理解的最简单方法是什么?
  • 您是否必须使用do block/>>=来执行此操作,还是可以使用其他方法将列表理解混合在一起?

澄清:通过"假"列表理解我的意思是创建一个函数,它接受相同的输入并产生相同的输入,即返回值的表单,压缩在一起的列表,以及谓词或多个谓词.

aug*_*tss 19

Haskell报告中的第3.11节准确描述了列表推导的含义,以及如何将它们转换出来.

如果你想要monad理解,你基本上需要在翻译中替换[e]by return e,[]by mzeroconcatMapby (>>=).


Gab*_*lez 10

为了增加augustss答案,如果你有类似的东西:

[(x, y) | x <- [1..3], y <- [1..3], x + y == 4]
Run Code Online (Sandbox Code Playgroud)

......它等同于这种do符号的使用:

do x <- [1..3]
   y <- [1..3]
   guard (x + y == 4)
   return (x, y)
Run Code Online (Sandbox Code Playgroud)

......这相当于以下用途concatMap:

concatMap (\x ->
    concatMap (\y ->
        if (x + y == 4) then [(x, y)] else []
        ) [1..3]
    ) [1..3]
Run Code Online (Sandbox Code Playgroud)