F#list.fold最大值

时间:2018-11-27 12:49:52

标签: list f# max fold

我想在F#中使用一个新的内置函数(list.fold)。我有一个清单,里面有数字,我必须返回最大值。如果列表为空,则应该为0。我尝试通过以下方式解决它:

let max a b : Nat = if a > b then a else b
let maxofList = List.fold max
let maximum (xs: Nat list): Nat = maxofList xs 

我无法编译它,也不知道如何以其他方式解决它,也许我只是不太了解内置函数的工作原理。输入看起来像这样:

maximum [12N; 4N; 67N; 5N] = 67N

1 个答案:

答案 0 :(得分:3)

如注释中所述,您在使用Nat类型有点令人困惑-这是您正在使用的库中某个位置定义的自定义类型,而不是标准的F#类型。您应该可以使用Nat类型的东西,但是我将简化它们并使用整数。

现在,您的代码几乎正确了。唯一的问题是List.fold使用一个函数将当前状态与下一个元素(即您的max)组合在一起,但它还需要一个初始状态。此数字应比列表中的其他任何数字都最小。如果您只有正数,则可以使用零:

let max a b : int = if a > b then a else b
let maxofList = List.fold max 0 // Added '0' as an extra parameter here!
let maximum (xs: int list): int = maxofList xs

对于您来说,这很可能是0N。另外,您可以使用List.reduce,它将列表的第一个元素作为初始值,如果列表为空,则失败:

let maxofList = List.reduce max