Functional programming Ocaml模式匹配疑虑
关于Ocaml中的模式匹配,我有点问题 基本上,我需要编写一个名为reversed的函数,它接受一个列表并检查它是否按相反的顺序 到目前为止:Functional programming Ocaml模式匹配疑虑,functional-programming,ocaml,Functional Programming,Ocaml,关于Ocaml中的模式匹配,我有点问题 基本上,我需要编写一个名为reversed的函数,它接受一个列表并检查它是否按相反的顺序 到目前为止: let rec reversed (x:int list):bool = match x with | [] -> true | y::z::tl -> if y < z then false else reversed tl; | y::[] -> true;; 这是完全可以理解的,因为没有更多的尾巴,
let rec reversed (x:int list):bool =
match x with
| [] -> true
| y::z::tl -> if y < z then false else reversed tl;
| y::[] -> true;;
这是完全可以理解的,因为没有更多的尾巴,它只是与y匹配::[]
我该如何解决这个问题
PS:这是我使用Ocaml的第一天。对不起,如果问题很简单:D
PPS:我故意只使用Core。(无模块)
购买力平价:我理解如果我做了一些根本错误的事情,请指出它。你的程序逻辑是错误的。您想检查列表是否颠倒(减少?)。但是你的程序在输入时失败了
[5;3;4;2;1]
告诉你它是反向的/递减的。这是因为你过早地放弃了3。你的中间分句应该是:
| y::z::tl -> if y < z then false else reversed (z::tl);
| y::z::tl->如果y
函数中的问题如下:
| y::z::tl->如果y
让我们看看您的列表:[5;4;3;1;2]
它是这样分解的:
| 5::4::[3;1;2]
比较5和4,然后调用回复为[3;2;1]。这意味着4和3之间的比较没有完成(您可以尝试使用类似于[5;4;99;98;97]的列表,这是您得到的意外结果)
您应该做的是在z上进行测试,然后使用列表的其余部分恢复调用。但如果您尝试以下方法:
| y::z::|->如果y
编译器会对你大喊大叫,因为z是一个int(不再是int列表)。要解决此问题,您可以通过在tl前面添加z来“重建”列表:
| y::z::tl->如果y
或者在提取z的同时,将列表命名为y(其中包含z):
| y::(z:u作为tl)->如果y
至于你对这个问题的猜测,我理解你的逻辑,但实际上并不是这样。
[]可以在分解中“命名”,就像它是常规节点一样
看看这个例子,一个(坏)函数测试是否达到列表的末尾:
let is_end l=将l与
|a->false
|[]->正确代码>
如果您试图将其放入解释器中,您应该会收到以下消息:
警告11:此匹配案例未使用。
那是因为[]已经在第一场比赛中被抓住了。您可以尝试使用is_end[]
,它返回false
正确的处理方法是如何在代码中执行此操作:
let is_end l=将l与
|x::->false
|[]->正确
您应该使用|y::z::tl->如果y
如果y>z,则不应从下一轮列表中删除z,因为z尚未与下一项进行比较
你也不需要在那一行
正确的代码是
let rec reversed = function
| [] -> true
| hd::[] -> true
| hd1::hd2::tl ->
if hd1 < hd2 then false
else reversed (hd2::tl)
let rec reversed=函数
|[]->正确
|hd::[]->true
|hd1::hd2::tl->
如果hd1
下面是另一种使用其他一些概念(如图案保护和通配符)编写的方法:
let rec reversed = function
| [] | [_] -> true
| hd1::hd2::_ when hd1 < hd2 -> false
| _::tl -> reversed tl;;
let rec reversed=函数
|[]正确
|hd1::hd2::\当hd1false时
|_u3;::tl->反向tl;;
这样一来,一个是真的,一个是假的,还有一个是递归的。我的天啊,我看不出来。无论如何,[5;4;3;1;2];;我现在似乎也在工作。y::z::tl已经捕捉到了还是什么?@Secret当然,模式说:一个至少有2个元素的列表除了已经给出的答案外,让我挑剔一下如果y
只是一个复杂的说法y>=z&&E
。哈哈,我不好意思说我不知道“何时”存在,谢谢。这很干净
let rec reversed = function
| [] | [_] -> true
| hd1::hd2::_ when hd1 < hd2 -> false
| _::tl -> reversed tl;;