我在OCaml中遇到了我的nth-element函数。我找不到什么是错的

时间:2016-10-08 16:55:36

标签: list ocaml

函数nth必须像这样工作:

# nth [1;2;3;4;5] 0;;
- : int = 1
# nth [1;2;3;4;5] 1;;
- : int = 2
# nth [1;2;3;4;5] 2;;
- : int = 3
# nth [1;2;3;4;5] 3;;
- : int = 4

我写了这个名为nth的函数:

let rec nth l n =
    match l with
    |[] -> raise (Failure "list is too short")
    |hd::tl -> 
    if n > 0 then nth tl n-1 else hd 

所以我键入nth [1;2;3;4;5] 3,预期输出为4,但控制台说“列表太短”

我期望的算法是这样的: nth [1; 2; 3; 4; 5] 3

1::[2;3;4;5] 3 > 0 is true, so nth [2;3;4;5] 2 is called.
2::[3;4;5] 2 > 0 is true, so nth [3;4;5] 1 is called.
3::[4,5] 1 > 0 is true, so nth [4;5] 0 is called
4::[5] 0 > 0 is false, so return 4
so nth [1;2;3;4;5] 3 = 4

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:3)

这是一个优先问题。表达式nth tl n-1的解析方式如下:(nth tl n) - 1。你需要这样的括号:nth tl (n - 1)

如果您使用字符串列表(例如)尝试当前代码,您将从顶层获得可能更有用的错误消息。

除了这个问题,你的代码看起来很棒。