gpt4 book ai didi

list - 在 SML 的列表中查找最大元素

转载 作者:行者123 更新时间:2023-12-04 05:24:20 26 4
gpt4 key购买 nike

我正在尝试使用标准 ML 在列表中找到最大值。我需要使用给定的折叠功能:

 fun fold f [] base = base
| fold f (x::xs) base = fold f xs (f x base);

这是我到目前为止所拥有的:
fun max (x::xs) = fold (fn (a, b) => if a > b then a else 0) x (x::xs);

我在那里有 0,因为如果列表为空,那么我需要返回 0;
这只是我需要定义的另一个函数的一部分,但我正在努力处理折叠部分。

最佳答案

在您对 fold 的定义中函数,您需要函数 f必须以 curry 形式接受它的参数,即:f 1 1而不是 f(1,1) .

据我了解,那么您对 ​​fold 的定义功能是正确的。因此,您需要对 max 中的匿名函数进行适当的更改。功能。

在 SML 中,柯里化(Currying)实际上只是语法糖。例如:

fun foo a b = a+b

最终会变成(脱糖后):
val rec foo = fn a => fn b => a+b

还可以看出,这两个函数具有相同的类型:
- fun foo a b = a+b;
val foo = fn : int -> int -> int
- val rec foo = fn a => fn b => a+b;
val foo = fn : int -> int -> int

因此,匿名函数必须在某种程度上沿着相同的路线定义。

此外,您还混合了 fold 的参数。 .在 max 的最后一部分函数,您以相反的顺序给出最后两个参数。

最后一个问题是您的匿名函数返回 0。这与您的匿名函数的不变量有关,并在某些情况下使其失败。例如:
max [1,4,65,7,6];

试着自己找出原因。

如果输入列表为 max确实需要返回0是空的,那么你应该模式匹配这种情况。这也修复了关于“匹配非详尽”的警告,并且是正确的地方。
fun max [] =  0
| max (x::xs) = fold (fn a => fn b => if a > b then a else b) (x::xs) x;

关于list - 在 SML 的列表中查找最大元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13372123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com