在F#中实现列表的存在

时间:2014-11-09 16:46:42

标签: list f# exists

我是函数式语言编程的新手。我正在尝试为列表实现F#exists。

let rec exist f list = match list with |[] -> None | h::t -> if f h then true else exist f t

编译文件时出现错误: “这个表达式预计会有'a option'类型,但这里有bool类型” 和idk我应该如何解决它。感谢。

2 个答案:

答案 0 :(得分:2)

该函数的返回类型是冲突的。与[]匹配时,您的代码会提供None,这是一种选项类型。但是,当与h::t匹配时,它会给出布尔值或调用递归。

微创矫正,假设bool返回类型:

let rec exist f list =
    match list with
    | [] -> false
    | h::t -> if f h then true else exist f t

更多侵入性矫正,假设bool返回类型

let rec exist f = function
    | [] -> false
    | h::t -> f h || exist f t

请注意,如果左侧返回true,则短路运算符||不会调用递归。

答案 1 :(得分:1)

重复我的评论作为答案:

match表达式的两种情况都需要返回相同的类型。空列表的第一个子句返回None,其类型为'a Option。在合同中,非空列表的那个返回bool。您应该更改第一个子句以返回bool