List 对Haskell列表的工作方式感到困惑

List 对Haskell列表的工作方式感到困惑,list,haskell,List,Haskell,我是一名新程序员,正在使用Haskell。我发现了一行名为find的代码,它将一个字符串与其在列表中对应的一对匹配起来。像这样 find a b = [x|(y,x) <- b, a==y] find a b=[x |(y,x)我会发出那种理解的声音 所有x的列表,使得(y,x)从b和a==y中提取 另一种更为顺序地阅读的方式: 从b中绘制一对(y,x)。对于每一对,检查a==y。如果是,则生成x;否则,继续下一对 我还应该注意到变量名有点混乱。在Haskell中,给出列表或其他容器的复

我是一名新程序员,正在使用Haskell。我发现了一行名为find的代码,它将一个字符串与其在列表中对应的一对匹配起来。像这样

find a b = [x|(y,x) <- b, a==y]

find a b=[x |(y,x)我会发出那种理解的声音

所有
x
的列表,使得
(y,x)
b
a==y
中提取

另一种更为顺序地阅读的方式:

b
中绘制一对
(y,x)
。对于每一对,检查
a==y
。如果是,则生成
x
;否则,继续下一对

我还应该注意到变量名有点混乱。在Haskell中,给出列表或其他容器的复数名是惯用的。所以更像

find a abs = [x | (y, x) <- abs, a == y]
find a abs=[x |(y,x)你似乎将“
x | x
”视为一件事。相反,列表理解是这样工作的:

[
表达式返回
|
要迭代的内容
]


您的示例基本上说的是“从
b
中绘制
(x,y)
,扔掉任何不满足
a==y
,然后返回
x
”。

让我们给您一个示例,以便将其可视化:

find a b = [x|(y,x) <- b, a==y]
findab=[x |(y,x)