[英]OCAML: form of function is incorrect
我有一个函数,everyNth,它接受用户创建的列表以及数字 i,并创建一个新列表,其中包含在用户创建的列表中找到的每个 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 是一种多范式语言,您可以拥有其值可以更改的可变变量。但我认为这是以后要学习的东西。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.