使用列表推导式查找列表中的单个元素

Finding a single element in a list using list comprehension

函数 valueOf 从元组列表中获取相应 StringInt 值。 有人可以解释第三行是如何工作的吗?

type State = [(String,Int)]

valueOf :: State -> String -> Int
valueOf xs var  = head [b | (a,b) <- xs , a ==var ]

没见过Haskell这样的表达方式,我比较习惯这样的表达方式:

(\xs -> length xs > 15)

(a,b) <- xs 不是 lambda,它是 list comprehension

中的生成器

在这种情况下,它会依次绑定源列表 xs 中的对,并将它们与 (a, b) 匹配。布尔守卫 a == var 保留所有 a == var 为真的元素。

没有lambda表达式。您看到的是列表理解,这是一种创建满足特定条件的值列表的方法。

在这种情况下,理解 [b | (a,b) <- xs , a ==var ] 的意思类似于:创建一个包含所有 b 的列表,使得 (a, b) 是列表 xs 的一个元素,其中 a 等于 var.

在命令式伪代码中你可以写成

result = EMPTY_LIST
for (a,b) in xs:
    if a == var:
        result.add(b)
return result

因此,整个 valueOf 函数的工作原理是生成具有正确 String 键的值列表,然后使用 head 函数获取第一个值。请注意,如果没有匹配项,整个计算将崩溃。

valueOf xs var  = head [b | (a,b) <- xs , a ==var ]

等同于lambda表达式

valueOf = \xs var -> head [b | (a,b) <- xs , a ==var ]

但是,我想真正让您感到困惑的是列表理解[b | (a,b) <- xs , a ==var ]。此表达式按如下方式构建列表:遍历 xs 中的所有对(这是 (a,b)<-xs 部分),仅保留 a==var 中的所有对,然后取出所有剩余的 [=16] =] 并用这些建立一个列表。

前面有 head,这将简单地在 xs 中查找第一个分量为 var 的第一对,以及 return 它的第二个分量。如果没有找到这样的一对,将产生运行时间错误(除非xs是一个无限列表,这将导致程序永远运行)。