Recursion OCAML:函数的形式不正确

Recursion OCAML:函数的形式不正确,recursion,ocaml,Recursion,Ocaml,我有一个函数everyNth,它接受用户创建的列表和一个数字I,并使用在用户创建的列表中找到的每一个倍数创建一个新列表。例如,如果我输入 everyNth[1; 2; 3; 4; 5; 6] 3;; 结果是 int list = [3; 6] 此功能当前的形式为 int list-> int -> int list 我需要它 ('a list) -> int -> ('a list) 我会把代码贴在下面。我对ocaml非常陌生,因此任何建议或提示都将不胜感激 le

我有一个函数everyNth,它接受用户创建的列表和一个数字I,并使用在用户创建的列表中找到的每一个倍数创建一个新列表。例如,如果我输入

everyNth[1; 2; 3; 4; 5; 6] 3;;
结果是

int list = [3; 6]
此功能当前的形式为

int list-> int -> int list
我需要它

('a list) -> int -> ('a list)
我会把代码贴在下面。我对ocaml非常陌生,因此任何建议或提示都将不胜感激

let everyNth a i = 
  let rec aux = function
    |[]->[]
    |h :: t -> if h mod i = 0 then h::aux t else aux t in aux a;;

本质上,您希望有一个值在处理列表时跟踪您的位置。处理第一个元素时,值为1。下一个元素是2,依此类推。然而,在函数式编程中,无法修改变量的值。所以你无法想象有一个单一的增值。相反,您应该想象每个递归调用都有一个大1的函数参数

下面是一个函数,它使用以下技术返回列表的第4个元素:

let fourth list =
    let rec aux i l =
        match l with
        | [] -> failwith "List too short"
        | h :: t -> if i = 4 then h else aux (i + 1) t
    in
    aux 1 list

(事实上,OCaml是一种多范式语言,您可以使用可变变量,这些变量的值可以更改。但我认为这是以后要学习的内容。)
mod
是一个接受两个整数并返回一个整数的函数。因此,如果您编写
h mod i
,则表示
h
是一个整数。因此此函数仅适用于整数列表。据我所知(根据您对所需函数类型的描述),您希望根据原始列表中值的索引(位置)创建一个列表。这段代码是基于值本身而不是它们的位置进行测试的。这样做的最佳方式是什么?我是否可以在aux的每次迭代中增加一个int值,并将该值与给定的值I进行比较?是的,这正是我的建议。我将如何增加int值?我将写一个答案,这个注释区域太长了。