Haskell中的 | 符号表示什么?

6

有人能为我解释一下这段代码吗?

[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]

我不理解在Haskell中的这个|符号的含义。
4个回答

12

您应该将其阅读为“where”或“such that”-

-- x * y where x is from [2,5,10] and y is from [8,10,11] and x * y > 50
[  x * y   |   x    <-   [2,5,10],    y    <-   [8,10,11],    x * y > 50]

或者,如果您熟悉Python和它的列表推导式,您也可以将其理解为"for"

-- [x * y for x in [2,5,10] for y in [8,10,11] if x * y > 50]
   [x * y  |  x <- [2,5,10],    y <- [8,10,11],   x * y > 50]

2
@Koushik 这个符号在函数定义中用于引入一个守卫,但这不是它们在这里使用的方式。 - Chris Taylor
1
整个结构,包括 | 符号,被称为 列表推导式 - user2864740

4

符号'|'在数学(集合论)中与符号'∣'具有相同的含义,只需将其读作“such that”。在数学中,符号'|'有时被代替为':'。

符号'<-'可读作“is drawn from”

表达式x <- [2,5,10]被称为生成器。一个列表推导式可以有多个生成器,连续的生成器之间用逗号分隔。

列表推导式还可以使用称为过滤器的逻辑表达式来过滤先前生成器产生的值。如果过滤器为True,则当前值将保留,如果为False,则将丢弃这些值。例如,推导式[x | x <- [1..10], even x]从列表[1..10]中产生所有偶数的列表[2,4,6,8,10]

希望这样能帮助您理解列表推导式中符号'|'和'<-'的含义。


3
一个列表,其元素的形式为x*y,其中x[2,5,10]中的元素,y[8,10,11]中的元素,并且x*y大于50。这里的|符号是列表推导语法的一部分;它不是运算符或具有独立含义的任何其他内容,它只是用来将定义列表元素的表达式(在本例中为x*y*部分)与生成器和过滤器(x <- [2,5,10], y <- [8,10,11], x*y > 50部分)分开。在翻译成英语时,我将|符号渲染为“such that”;“where”也很常见。
写列表推导式的语法灵感来自数学中集合推导式的书写方式。在该页面上的示例中,您可以清楚地看到使用竖杠将集合元素的形式与元素条件分隔开。

1
我更愿意将这里的|理解为在以下条件下:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接