Functional programming Ocaml模式匹配疑虑

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;; 这是完全可以理解的,因为没有更多的尾巴,

关于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;;
这是完全可以理解的,因为没有更多的尾巴,它只是与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;;