繁体   English   中英

OCAML:函数形式不正确

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM