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

时间:2013-12-19 17:22:04

标签: haskell monads ghc

  • 列表推导只是一种语言功能吗?
  • 使用纯Haskell伪造列表理解的最简单方法是什么?
  • 您是否必须使用阻止/ >>=来执行此操作,还是可以使用其他功能 一起黑客列表理解的方法?
澄清:通过“假”列表理解我的意思是创建一个函数,它接受相同的输入并产生相同的输入,即返回值的表单,列表拼凑在一起,以及谓词或多个谓词。

2 个答案:

答案 0 :(得分:19)

Haskell报告中的

Section 3.11确切地描述了列表推导的含义,以及如何将它们翻译出去。

如果你想要monad理解,你基本上需要[e]替换return e[]替换mzeroconcatMap替换(>>=)翻译。

答案 1 :(得分:10)

要增加augustss的答案,如果你有类似的话:

[(x, y) | x <- [1..3], y <- [1..3], x + y == 4]

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

do x <- [1..3]
   y <- [1..3]
   guard (x + y == 4)
   return (x, y)

...相当于concatMap的使用:

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