在ml数组结构中找到max / min

时间:2013-05-07 15:08:38

标签: sml

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

提示可能非常有用,因为像hd或tl这样的函数不适用于数组

2 个答案:

答案 0 :(得分:4)

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

基本上,如果它是常规列表,您可以像解决问题一样解决问题。但是,您只需要使用Array模块中的折叠功能。与常规列表不同,我们不能将它们模式匹配以将其分解为第一个元素和列表的其余部分,因此我们必须通过sub函数选择第一个元素。要确保列表中有元素,可以使用比较数组的length的测试来包装它。

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进行交换。

答案 1 :(得分:3)

在OCaml:

let min_array arr = Array.fold_left min arr.(0) arr

此代码使用arr.(0)作为最小值的初始候选项,如果数组为空则失败,因此您可能需要检查或使用特定于域的初始候选项,该候选项始终大于实际值最小(我个人对在这些情况下使用max_int持谨慎态度)。

我看到SML有foldl函数允许做同样的事情。我会让你根据需要调整语法。