Sml 在int数组结构中查找最大/最小值(以ml为单位)

Sml 在int数组结构中查找最大/最小值(以ml为单位),sml,Sml,我是ML的新手,我很难提取整数数组的最小值或最大值。 我已经使用从整数列表创建了数组 提示可能非常有用,因为像hd或tl这样的函数不适用于OCaml中的阵列: let min_array arr = Array.fold_left min arr.(0) arr 此代码使用arr.(0)作为最小值的初始候选,如果数组为空,则会失败,因此您可能需要检查该值,或者使用始终大于实际最小值的特定于域的初始候选值(我个人担心在这些情况下使用max_int) 我看到SML有一个foldl函数,允许做同样的

我是ML的新手,我很难提取整数数组的最小值或最大值。
我已经使用从整数列表创建了数组

提示可能非常有用,因为像hd或tl这样的函数不适用于OCaml中的阵列:

let min_array arr = Array.fold_left min arr.(0) arr
此代码使用
arr.(0)
作为最小值的初始候选,如果数组为空,则会失败,因此您可能需要检查该值,或者使用始终大于实际最小值的特定于域的初始候选值(我个人担心在这些情况下使用
max_int

我看到SML有一个
foldl
函数,允许做同样的事情。我将让您根据需要调整语法。

在OCaml中:

let min_array arr = Array.fold_left min arr.(0) arr
此代码使用
arr.(0)
作为最小值的初始候选,如果数组为空,则会失败,因此您可能需要检查该值,或者使用始终大于实际最小值的特定于域的初始候选值(我个人担心在这些情况下使用
max_int


我看到SML有一个
foldl
函数,允许做同样的事情。我将让您根据需要调整语法。

如上所述,您在SML中的功能基本相同。
在处理数组而不是列表时,必须使用以数组而不是列表作为输入的函数。不用说

基本上你可以用同样的方法解决这个问题,如果它是一个常规列表的话。但是,您只需要使用阵列模块中的折叠功能。与常规列表不同,我们无法通过模式匹配将其分解为第一个元素和列表的其余部分,因此必须通过函数选择第一个元素。为了确保列表中有元素,您可以使用一个测试对其进行包装,该测试将比较数组的属性

fun min_arr arr = Array.foldl Int.min (Array.sub (arr, 0)) arr


- val a = Array.fromList [5,76,2,6,8,2,3,7,81,3];
val a = [|5,76,2,6,8,2,3,7,81,3|] : int array
- min_arr a;
val it = 2 : int

要查找列表中最大的元素,您可以将
Int.min
函数与
Int.max

进行交换,如上所述,您在SML中的功能基本相同。
在处理数组而不是列表时,必须使用以数组而不是列表作为输入的函数。不用说

基本上你可以用同样的方法解决这个问题,如果它是一个常规列表的话。但是,您只需要使用阵列模块中的折叠功能。与常规列表不同,我们无法通过模式匹配将其分解为第一个元素和列表的其余部分,因此必须通过函数选择第一个元素。为了确保列表中有元素,您可以使用一个测试对其进行包装,该测试将比较数组的属性

fun min_arr arr = Array.foldl Int.min (Array.sub (arr, 0)) arr


- val a = Array.fromList [5,76,2,6,8,2,3,7,81,3];
val a = [|5,76,2,6,8,2,3,7,81,3|] : int array
- min_arr a;
val it = 2 : int
要查找列表中最大的元素,可以将
Int.min
函数与
Int.max

交换,可以使用
Array.iter(fun i->if i>!max\u i then max\u i:=i else())arr
可以使用
Array.iter(fun i->if i>!max\u i then max\u i:=i else())arr