为什么我的搜索功能总是输出true?

时间:2019-09-27 07:16:05

标签: functional-programming pattern-matching ocaml

let rec contains (x: int list)(y: int) : bool =
begin match x with
| [] -> false
| [y] -> true
| hd::tail -> (hd = y) && (contains tail y)
end

我不确定我的模式匹配哪里出了问题,但是对于我输入的任何非空列表,我都会一直将“ true”作为我的返回类型,当我希望它仅在输入时返回true int存在于列表中。

1 个答案:

答案 0 :(得分:3)

您有几个问题。 首先是您使用模式匹配来检查列表是否正好是combineTimer.interval = someNewInterval 。 这不是它的工作方式,它实际上将与具有单个元素的任何列表匹配。 如果要声明类似的等式,可以使用[y]子句。

when

第一个let rec contains (l : int list) (y : int) : bool = begin match l with | [] -> false | [z] when z = y -> true | [z] -> false | hd :: tl -> hd = y && contains tl y end 将在包含您的[z] when z = y的列表上触发。 第二个子句y将在其余子句上触发。

然后,您遇到的最后一个问题是:[z]属于y,如果它是hd :: tl ,如果它属于{{1} }。您使用了,所以这是不对的。 这给了我们:

hd

当然,这甚至可以简化。

tl

实际上,不需要使用一个元素对列表进行特殊处理。 let rec contains (l : int list) (y : int) : bool = begin match l with | [] -> false | [z] when z = y -> true | [z] -> false | hd :: tl -> hd = y || contains tl y end let rec contains (l : int list) (y : int) : bool = begin match l with | [] -> false | hd :: tl -> hd = y || contains tl y end 相同。

总而言之,如果元素位于头部,那么就可以找到它,否则,您可以从尾部开始,依此类推,直到到达空白列表,这意味着您找不到它。