of在这些惰性列表的定义和使用该类型的函数中,关键字的作用是什么?它只是一个定义 类型的构造函数Cons,以便它接受 aunit并计算 a llist,还是还有更多需要考虑?
type 'a llist = Cons of 'a * (unit -> 'a llist)
let rec lnat i = Cons (i, (fun () -> lnat (i + 1)))
Run Code Online (Sandbox Code Playgroud)
(-lnat函数接受一个 int 并从该输入 int 开始构造一个所有自然数的列表)。
我尝试通过迭代一个带有空列表的列表来编写complst自己的解决方案,其中所有非重复项都被插入然后返回。在查找解决方案后,我知道这是一种过于复杂的方法,但仍然想了解为什么模式匹配不能按预期工作:
let compress list =
let rec aux complst lst =
match lst with
| [] -> complst
| a :: (b :: c) -> if a = b then aux complst (b::c) else aux (a::complst) (b::c)
| x -> x
in aux [] list;;
val comp : 'a list -> 'a list = <fun>
Run Code Online (Sandbox Code Playgroud)
无论输入如何,输出始终是一个仅包含最后一个元素的列表:
compress [1;1;2;2;3];;
- : int list = [3]
compress [1;2;3];;
- : int list = [3]
Run Code Online (Sandbox Code Playgroud) recursion ocaml functional-programming list pattern-matching