我是函数式语言编程的新手。我正在尝试实现F#tryFindIndex函数。
let rec tryFindIndex func list =
match list with
| [] -> None
| hd::tl -> if func hd then Some(0)
else (tryFindIndex func tl) + 1
问题在于最后一行,因为添加1会导致返回类型为'int'而不是'int option'。我需要递归地跟踪索引。
答案 0 :(得分:3)
将索引作为附加参数传递。如果你不这样做,那么你的函数也不是尾递归的。还可以将递归实现为一个单独的循环来隐藏索引参数。
let tryFindIndex func list =
let rec loop func list index =
match list with
| [] -> None
| hd::tl -> if func hd then Some(index)
else loop func tl (index+1)
loop func list 0
正如约翰在评论中指出的那样,核心库的实现如下:
let tryFindIndex f list =
let rec loop n = function[] -> None | h::t -> if f h then Some n else loop (n+1) t
loop 0 list