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存在于列表中。
答案 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
相同。
总而言之,如果元素位于头部,那么就可以找到它,否则,您可以从尾部开始,依此类推,直到到达空白列表,这意味着您找不到它。