You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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作为它的左右参数,这完全不符合类型要求,自然会报错。

正确的写法有两种简洁方式:

  1. 利用柯里化特性直接传递部分应用的函数
    因为elem的类型是Eq a => a -> [a] -> Bool,当你传入第一个参数"A"后,elem "A"会返回一个类型为[String] -> Bool的函数,这个函数正好可以作为map的第一个参数,用来遍历m中的每个子列表:
map (elem "A") m
  1. 使用lambda表达式显式定义判断逻辑
    如果觉得柯里化不够直观,也可以用lambda表达式明确写出对每个子列表的判断:
map (\xs -> "A" `elem` xs) m

两种写法都能得到你想要的[True, False, ...]的布尔列表结果。


内容的提问来源于stack exchange,提问作者tree

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:42