在这里,我们演示了如何使用OCaml的模式匹配语法来递归处理列表。
let rec map f lst = match lst with | [] -> [] | hd::tl -> (f hd)::(map f tl)
在这种情况下,模式[]匹配空列表,而hd::tl匹配任何具有至少一个元素的列表,hd并将列表的第一个元素分配给,列表的其余部分(可以为空)分配给tl。
请注意,这hd::tl是一种非常通用的模式,它将匹配任何不为空的列表。我们还可以编写与具有特定数量的元素的列表匹配的模式:
(* Return the last element of a list. Fails if the list is empty. *) let rec last lst = match lst with | [] -> failwith "Empty list" | [x] -> x (* Equivalent to x::[], [x] matches a list with only one element *) | hd::tl -> last tl (* The second to last element of a list. *) let rec second_to_last lst = match lst with | [] -> failwith "Empty list" | x::[] -> failwith "Singleton list" | fst::snd::[] -> snd | hd::tl -> second_to_last tl
另外,OCaml支持列表元素本身的模式匹配。我们可以更详细地了解列表中元素的结构,OCaml会推断出正确的函数类型:
(* Assuming a list of tuples, return a list with first element of each tuple. *) let rec first_elements lst = match lst with | [] -> [] | (a, b)::tl -> a::(first_elements tl) (* val first_elements : ('a * 'b) list -> 'a list = <fun> *)
通过将这些模式组合在一起,我们可以处理任何任意复杂的列表。
我编写了一个脚本,可以递归地从一个目录复制到另一个目录,跳过文件名中具有特定模式的文件: 在大多数情况下,它工作得很好。但我的问题是,它在每个文件夹中创建了一个子文件夹,其中包含文件。例如: 如果输入源作为具有此结构的目录: 我希望在目标文件夹中创建以下结构: 但相反,我得到了: 知道我哪里错了吗?
我有一个这样的字符串: 我需要处理这样上面的代码就变成了 我需要一直这样做直到我 我的模式字符串将匹配整个内容。不是。 Java代码:
本文向大家介绍OCaml 否定范式:深度模式匹配,包括了OCaml 否定范式:深度模式匹配的使用技巧和注意事项,需要的朋友参考一下 示例 模式匹配允许解构复杂的值,并且绝不限于值表示的“最外部”级别。为了说明这一点,我们实现了将布尔表达式转换为布尔表达式的函数,其中所有否定都仅存在于原子上,即所谓的否定范式和谓词可识别这种形式的表达式: 我们定义布尔表达式的类型,其原子由字符串标识为 让我们首先定
问题内容: 该字符串可以类似于以下之一: 我想匹配不限数量的“ a(x,y)”。如何使用Regex做到这一点?这是我所拥有的: 它仅匹配“ a(x,y)”的两个递归。 问题答案: Java的标准正则表达式库不支持递归,因此您无法将此类通用嵌套结构与之匹配。 但是在确实支持递归的版本(Perl,PCRE,.NET等)中,您可以使用以下表达式:
字符串可以类似于以下内容之一: 我想匹配无限数量的“a(x,y)”。我如何使用正则表达式来实现这一点?以下是我所拥有的: 它只匹配"a(x, y)"的两个递归。
问题内容: 我使用Java中的正则表达式来捕获组,即使我知道表达式匹配,它也会不断抛出一个。 这是我的代码: 我期待是因为在正则表达式的捕获组拍摄的,而是我得到: IllegalStateException:找不到匹配项 我也尝试过,但发生相同的错误。 根据该文件,并: 捕获组从左到右从一个索引开始。零组表示整个模式,因此表达式等于。 我究竟做错了什么? 问题答案: 是帮助程序类,它处理数据迭代以