使用列表推导式查找列表中的单个元素
Finding a single element in a list using list comprehension
函数 valueOf
从元组列表中获取相应 String
的 Int
值。
有人可以解释第三行是如何工作的吗?
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
是一个无限列表,这将导致程序永远运行)。
函数 valueOf
从元组列表中获取相应 String
的 Int
值。
有人可以解释第三行是如何工作的吗?
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
是一个无限列表,这将导致程序永远运行)。