我有一个(string * int) list元素列表,我需要找到最大的int元素并返回相应的(string * int)元素。
我有这样的atm,但问题是,我认为我的方法更多是“典型编程”
let it = [] in
for x = 0 to length LIST - 1 do
let str = ((List.nth LIST x).string) in
let num = ((List.nth LIST x).int) in
let it = it @ [num, str] in
let (str, num) = List.hd(List.rev it) in
[str, num]
Run Code Online (Sandbox Code Playgroud)
我想做的是循环遍历列表,并将字符串和int值添加到另一个列表中,然后对其进行排序,反转,然后使用head(应该是最大int),然后我需要返回该对 (string * int)
您的代码不是格式正确的OCaml代码。但是,它突出显示了您对OCaml的理解上的一些问题。
首先,默认情况下,OCaml中的值是不可变的。例如,
let x = 0 in
for i = 0 to 10 do
let x = x + 1 in
print_int x;
done
Run Code Online (Sandbox Code Playgroud)
您将得到11111111111作为输出。这是因为,在循环期间,每次x+1表达式每次都在计算时,x总是在哪里,并且总是0会得到1结果。这是因为,let x = <expr> in <body>不是在更改现有变量,x而是在创建一个新变量x(遮盖以前的所有定义)并使它在<body>表达式的范围内可用。
通常,关于您的问题,应将其作为递归函数来解决,该函数greatest_element具有以下定义,
[]它是未定义的;[x]是它是x;x::xs它的列表是max x (greatest_element xs),其中max x y是x如果它是大于或等于y。
最后,您似乎已经错过了OCaml的第一步,并且在解决此任务之前,您必须先回过头来学习基础知识。特别是,您必须学习如何调用函数,绑定变量,以及通常该语言的词汇约定和语法是什么。如果您需要指示器,请随时询问。