F#list.fold最大值
我想在F#中使用一个新的内置函数(list.fold)。我有一个包含数字的列表,我必须返回其中的最大值。如果列表为空,则应为0。我试着用这种方法来解决这个问题:F#list.fold最大值,list,f#,max,fold,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 我无法编译它,也不知道如何用另一种方式解决它,也许我只是不太了解内置函数是如何工作的。输
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
正如注释中所指出的,您使用的是
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
正如注释中所指出的,您使用的是
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
我也不能编译它;您在哪里找到类型
Nat
?忽略这一点,您的第三行(或者第二行)缺少折叠的初始值。如果Nat
是一种反映自然数的类型(从1开始),那么1N
就可以了。我想用Nat表示自然数,但可能我的整个代码都错了。我想用另一种方法来尝试,使用“match x with”函数,但我不知道如何正确地编写它;您在哪里找到类型Nat
?忽略这一点,您的第三行(或者第二行)缺少折叠的初始值。如果Nat
是一种反映自然数的类型(从1开始),那么1N
就可以了。我想用Nat表示自然数,但可能我的整个代码都错了。我想用另一种方式尝试它,使用“match x with”函数,但我不知道如何正确编写。值得一提的是还有List.max(和List.maxBy):值得一提的是还有List.max(和List.maxBy):