【问题标题】:What does "<-" mean in a list comprehension?“<-”在列表理解中是什么意思?
【发布时间】:2012-09-20 12:06:45
【问题描述】:

在这段代码中:

[x | temp <- str, x <- isVowel temp]

我想知道是什么

  • &lt;- 运营商可以
  • &lt;- str 运营商可以

isVowel 如果其参数是元音,则返回 true。

【问题讨论】:

  • 你试过这段代码吗:它编译了吗,输出是什么?
  • 代码有效,我从朋友那里得到了帮助,前一阵子只是想尝试实际做一些学习。我的想法 r
  • 如果isVowel 的类型为Char -&gt; Bool,则此代码不起作用。无论如何,您是否尝试过谷歌搜索“haskell list理解”?它会出现thisthis 等资源。
  • 没有 cmets 的反对票没有帮助
  • 如果“isVowel 在其参数是元音时返回 true”,那么您应该将其重写为 [x | temp &lt;- str, x &lt;- [isVowel temp]],或者更常规地写为 [x | temp &lt;- str, let x = isVowel temp]。您将其大声朗读为“对于str 中的每个temp,...”。

标签: string haskell variable-assignment list-comprehension operator-keyword


【解决方案1】:

你说得对,&lt;- 有点像作业。

如需更多信息,here's 是学习列表推导的绝佳资源。

列表推导与集合推导非常相似。我们现在将坚持获取前 10 个偶数。我们可以使用的列表推导是 [x*2 | x 。 x 是从 [1..10] 中提取的,对于 [1..10] 中的每个元素(我们已经绑定到 x),我们得到那个元素,只是加倍。

然而,这还不是全部:

  • &lt;-也用于do notation

    在 do 表达式中,每一行都是一个单子值。为了检查它的结果,我们使用“

  • &lt;- 甚至在 monad comprehensions 中使用(虽然这没什么帮助,因为我相信标准 Haskell 中不再有 monad 推导式)

【讨论】:

    【解决方案2】:

    在列表推导中,&lt;- 基本上是“foreach”。每个pattern &lt;- list 子句都对其list 进行迭代:提取每个连续元素,并将其绑定到pattern 中的变量名,以用于其余子句以及结果表达式。

    所以,这很像分配。与命令式语言的主要概念区别在于没有修改或更新变量的概念:想法是您正在使用不可变值,这些值在每次迭代时都新“绑定”到它们的名称。

    请注意,多个 pattern &lt;- list 子句的行为类似于嵌套的 for 循环。

    【讨论】:

    • 我理解(并同意)你所说的&lt;- 就像foreach。不过,当您在列表以外的东西上使用&lt;- 时会发生什么,我有点困惑。例如,在OP给出的sn-p中,我们看到x &lt;- isVowel temp?在这种情况下到底发生了什么? 注意:我对 Haskell 也比较陌生... :)
    • @Miguel:这是一个类型错误。在列表推导中,&lt;- 的右侧必须是一个列表。
    • @hammar 那好吧。我觉得那很奇怪。谢谢:)
    • let-binding 的主要区别在于&lt;--binding 不是递归的,因此允许阴影,例如[y | x &lt;- list1, x &lt;- g1 x, let y = g2 x]。从g2的角度来看,x好像发生了变异。
    【解决方案3】:

    您最好将&lt;- 视为一个声明而不是运算符。

    &lt;- 类似于数学符号4 ∈ A 表示元素 4 属于集合 A),在 Haskell 中具有相同的含义。

    【讨论】:

      【解决方案4】:

      我肯定是错的,但我一直认为 &lt;- 读作 in 所以对于

      [x | temp <- str, x <- isVowel temp]
      

      就像temp in str 可以帮助您使用变量命名约定。因此,考虑到引用透明度,它可能读作... 返回一个列表 x in isVowel in str

      【讨论】:

      • "建立x列表 for x in isVowel temp for tempstr"。或者,按照正常的自上而下的顺序,“for temp in str, for x in isVowel temp, 收集 x".
      猜你喜欢
      • 2011-08-12
      • 2017-06-11
      • 2018-03-05
      • 2023-03-27
      • 2010-12-15
      • 2016-08-17
      • 2010-12-28
      • 2013-06-14
      • 1970-01-01
      相关资源
      最近更新 更多