返回OCaml中列表的第n个元素?

All*_*ang 8 recursion ocaml functional-programming list

我是Ocaml的新手,只是想确保如何执行一个简单的函数,比如使用递归函数返回列表的第n个元素?

原型样get_nth (list, n)int list * int -> int

例如 get_nth ([1,2,3], 1) -> 2

谢谢

pad*_*pad 13

您可能没有注意到,但List模块中List.nth已经存在功能.

如果要使用递归编写它:

let rec get_nth = function
    | [], _ -> raise (Failure "get_nth")
    | _, n when n < 0 -> raise (Invalid_argument "get_nth")
    | x::_, 0 -> x
    | x::xs, n -> get_nth(xs, n-1)
Run Code Online (Sandbox Code Playgroud)


LiK*_*Kao 5

使用元组作为这样的参数在OCaml中并不常见.通常你会使用currying并定义你的函数,如下所示:

let get_nth list n = ...
Run Code Online (Sandbox Code Playgroud)

这将有签名'a list -> int -> 'a.另请注意,'a此处有一个参数,这意味着,没有任何理由将您的功能仅限于整数.

现在让我们看一下这个问题.如果你想获得第0个元素,你的函数会是什么样子?

let get_nth list 0 = List.head list (* this is not actually valid in OCaml *)
Run Code Online (Sandbox Code Playgroud)

现在,如果你有一个函数从m个项目列表中获取第n个元素(NB n> m),你怎么能用这个函数构建另一个函数,它从m + 1个元素列表中得到第n + 1个元素?让n + 1个元素的函数成为get_nth'

let get_nth' list n' = get_nth (List.tail list) (n'-1)
Run Code Online (Sandbox Code Playgroud)

现在你需要做的就是将两者结合起来,你就完成了.我会把最后一部分留给你.

如果你遵循这个建议,你会得到比它必须更复杂的东西.但是,通过这种方式更容易理解发生了什么.