指定要与list.sum一起使用的列表参数的问题



我只是在f#中涉足,我正在尝试编写自己的简单函数(在fsx文件中,使用F#Interactive窗口运行它)作为练习int类型的列表,并使用 List.sum

返回此列表的总和
let sumMyList myList = List.sum myList

这个(显然)有错误

无法解析在此程序点或附近使用操作员( + )固有的歧义。考虑使用类型注释来解决歧义。

所以我想我将myList参数的类型指定为List<int>

let sumMyList myList:List<int> = List.sum myList

现在我有错误:

类型List<int>不支持操作员+

List.sum的F#文档说

List.sum : ^T list -> ^T (requires ^T with static member (+) and ^T with static member Zero)

我以为INT类型支持+操作员,如果我这样做

List.sum [1;2;3]

这一切都可以正常工作,因为[1;2;3]List<int>

我想念什么?如何将参数指定为INT类型列表?

您缺少括号,否则您指定返回值的类型:

let sumMyList myList:list<int> = List.sum myList

应该是

let sumMyList (myList:list<int>) = List.sum myList

您也可以指定以下内容:

let sumMyList myList:int = List.sum myList

要以通用的方式定义它,应将其声明为内联:

let inline sumMyList myList = List.sum myList

问题是编译器需要解决编译sumMyList时要使用的数字操作 - 它可以是int,float或其他(甚至是自定义)类型,所有这些都要求编译器生成不同的代码。

您可以使用类型注释指定类型(以及@gustavo的答案)显示您对此的所有选项。

另一个选项是将函数标记为inline,这将使与不同类型一起使用它(编译器将内联)使用它,然后选择每种函数使用的实际类型):

let inline sumMyList myList = List.sum myList

答案是我指定了完全错误的类型。

我突然有了做

的想法
[1;2;]

并在F#Interactive窗口中查看它(Alt + #仅运行该行)。它打印:

val it : int list = [1; 2]

看起来我仍然有我的C#开启 - 在F#中,指定了一个int列表为int list,而不是List<int>

我已经更改了我的功能:

let sumMyList (myList: int list) = List.sum myList

现在可以按预期工作。

最新更新