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

List 返回OCaml中列表的第n个元素?,list,recursion,functional-programming,ocaml,List,Recursion,Functional Programming,Ocaml,我是Ocaml新手,只是想确定如何使用递归函数执行简单的函数,例如返回列表的第n个元素 原型类似于使用int-list*int->int 例如get\n([1,2,3],1)->2 谢谢像这样使用元组作为参数在OCaml中并不常见。通常,您会使用咖喱,并定义如下函数: let get_nth list n = ... 这将有签名'a list->int->'a。还要注意,这里有一个'a参数,这意味着没有真正的理由将函数仅限于int 现在让我们来看看这个问题。如果你想得到第0个元素,你的函数是什

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

原型类似于使用
int-list*int->int

例如
get\n([1,2,3],1)->2


谢谢

像这样使用元组作为参数在OCaml中并不常见。通常,您会使用咖喱,并定义如下函数:

let get_nth list n = ...
这将有签名
'a list->int->'a
。还要注意,这里有一个
'a
参数,这意味着没有真正的理由将函数仅限于int

现在让我们来看看这个问题。如果你想得到第0个元素,你的函数是什么样的

let get_nth list 0 = List.head list (* this is not actually valid in OCaml *)
现在,如果您有一个从m个项目列表(N.B.N>m)中获取第N个元素的函数,那么如何使用该函数构建另一个从m+1个元素列表中获取第N+1个元素的函数?让n+1元素的函数为
get\n'

let get_nth' list n' = get_nth (List.tail list) (n'-1)
现在你需要做的就是把两者结合起来,你就完成了。最后一部分由你决定


如果你按照这个建议去做,你会得到比实际情况更复杂的东西。然而,通过这种方式更容易理解发生了什么。

您可能没有注意到,但是
列表中已经有了第n个
函数

如果要使用递归编写它:

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)
让rec获取函数
|[],->raise(失败“获取”)
|n,n当n<0->raise(无效参数“get\n”)
|x::,0->x
|x::xs,n->获取n(xs,n-1)
(我认为)不使用元组的简单解决方案可以是:

let rec get_nth mylist index = match mylist with
    | [] -> raise (Failure "empty list")
    | first::rest -> 
        if index = 0 then first 
        else get_nth rest (index-1)
;;
我已经读到,使用
Result
而不是引发错误会更好,因为您不必使用
try。。。使用
。(代码由@Omar编辑)


结果
核心.Std
的一部分,如果我没记错的话。

这听起来像是个家庭作业问题。如果您展示了一些您尝试过的代码,但这些代码并没有如您所希望的那样工作,这会有所帮助。我会给出正确的答案。在Ocaml函数中使用元组作为参数不是很习惯用法,需要分配。不幸的是,我担心您的尝试比需要的更令人困惑。Ocaml模式匹配本身就非常直观。
let rec get_nth mylist index = match mylist with
    | [] -> Error "empty list"
    | first::rest -> 
        if index = 0 then Ok first 
        else get_nth rest (index-1)
;;

let result [1; 2; 3] 2 in 
    match result with
    | Error reason -> print_string reason
    | Ok num -> print_int num
;;