Haskell中如何结合map函数调用elem函数?
问题
我有一个列表的列表:
m = [l1, l2, l3] l1 = ["A", "B"] l2 = ["B", "X"] -- 等等
我希望执行如下调用:
"A" `elem` l1 "A" `elem` l2 -- 等等
以得到类似[True, False, True]的结果,请问如何结合map函数使用elem?
我尝试了:
map `("A" `elem) m
但出现了「couldn't match type」的错误。
解决方案
你的问题出在运算符的使用方式上,Haskell中反引号是用来将普通函数转为中缀运算符的,你写的map ("A" elem) m相当于把map当作中缀运算符,让("A" elem)和m作为它的左右参数,这完全不符合类型要求,自然会报错。
正确的写法有两种简洁方式:
- 利用柯里化特性直接传递部分应用的函数
因为elem的类型是Eq a => a -> [a] -> Bool,当你传入第一个参数"A"后,elem "A"会返回一个类型为[String] -> Bool的函数,这个函数正好可以作为map的第一个参数,用来遍历m中的每个子列表:
map (elem "A") m
- 使用lambda表达式显式定义判断逻辑
如果觉得柯里化不够直观,也可以用lambda表达式明确写出对每个子列表的判断:
map (\xs -> "A" `elem` xs) m
两种写法都能得到你想要的[True, False, ...]的布尔列表结果。
内容的提问来源于stack exchange,提问作者tree
相关产品推荐
相关产品推荐

