列表理解是如何在Haskell中实现的? 列表理解仅仅是一种语言特征吗 使用纯Haskell伪造列表理解的最简单方法是什么 您必须使用Do块/>=来执行此操作,还是可以使用其他块 把一个列表拼凑在一起的方法

列表理解是如何在Haskell中实现的? 列表理解仅仅是一种语言特征吗 使用纯Haskell伪造列表理解的最简单方法是什么 您必须使用Do块/>=来执行此操作,还是可以使用其他块 把一个列表拼凑在一起的方法,haskell,monads,ghc,Haskell,Monads,Ghc,澄清:所谓“伪造”列表理解,我的意思是创建一个函数,该函数接受相同的输入并生成相同的输入,即返回值的形式、要一起处理的列表以及一个谓词或多个谓词。在Haskell报告中准确描述了列表理解的含义,以及如何将其翻译掉 如果你想理解单子,你基本上需要在翻译中用[e]替换[e],用mzero替换[],用concatMap替换(>=)。为了增加augustss的答案,如果你有以下情况: [(x, y) | x <- [1..3], y <- [1..3], x + y == 4] 。。。这相

澄清:所谓“伪造”列表理解,我的意思是创建一个函数,该函数接受相同的输入并生成相同的输入,即返回值的形式、要一起处理的列表以及一个谓词或多个谓词。

在Haskell报告中准确描述了列表理解的含义,以及如何将其翻译掉


如果你想理解单子,你基本上需要在翻译中用
[e]
替换
[e]
,用
mzero
替换
[]
,用
concatMap
替换
(>=)

为了增加
augustss
的答案,如果你有以下情况:

[(x, y) | x <- [1..3], y <- [1..3], x + y == 4]
。。。这相当于使用
concatMap

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

我可以回答你的一些问题。它解释了理解如何是do符号的语法糖,而do符号本身只是
>=
的语法糖,但我真的不知道“使用纯Haskell伪造列表理解”是什么意思。根据Haskell规范,这是纯粹的Haskell。我添加了一个澄清,但我真的不明白为什么会有这么多的反对票,我只是想问,如果不使用列表理解来更好地理解它们,如何编写列表理解。我认为这是一个合理的问题。我投了更高的票。
concatMap (\x ->
    concatMap (\y ->
        if (x + y == 4) then [(x, y)] else []
        ) [1..3]
    ) [1..3]