我是函数式语言编程的新手。我正在尝试为列表实现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我应该如何解决它。感谢。
答案 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
。