关于OCaml中List.filter与List.mem组合代码的理解疑问
OCaml代码逻辑解析
先指出原代码的关键问题:
原代码中
let lst = ["a", "b", "c"]定义的不是字符串列表,而是包含一个三元组("a", "b", "c")的列表,这会导致后续List.mem a lst出现类型不匹配错误(a是字符串,lst的元素是三元组)。正确的字符串列表定义应该是let lst = ["a"; "b"; "c"],以下基于修正后的代码展开解释。
核心函数作用拆解
List.filter:OCaml列表库的筛选函数,接收一个布尔判断函数和一个列表,遍历列表时仅保留让判断函数返回true的元素,最终返回筛选后的新列表。List.mem:检查某个元素是否存在于目标列表中,存在返回true,不存在返回false。
整体逻辑详解
代码中的判断函数fun (a, _b) -> not (List.mem a lst):
- 它接收二元组作为参数(
(a, _b)的写法表示提取二元组的第一个值a,第二个值_b用下划线标记为“无需使用”),因此输入列表assoc的元素必须是(string * 'any_type)类型的二元组。 List.mem a lst检查二元组的第一个元素a是否在字符串列表lst中。not (...)对上述结果取反:当a不在lst中时,整个表达式返回true,对应的二元组会被List.filter保留。
简单来说,这段代码的作用是:从assoc列表里筛选出所有第一个元素不在lst字符串列表中的二元组,返回筛选后的新列表。
示例验证
假设:
let lst = ["a"; "b"; "c"] let assoc = [("a", 1); ("d", 4); ("b", 2); ("e", 5)]
执行筛选后得到的结果是:[("d", 4); ("e", 5)]
内容的提问来源于stack exchange,提问作者Prisca Chidimma
相关产品推荐
相关产品推荐

