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

时间:2015-05-12 13:22:31

标签: f# inline f#-interactive

我只是在涉及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类型列表?

3 个答案:

答案 0 :(得分:3)

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

div

应该是

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

你也可以指定:

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

要以通用方式定义它,应该内联声明:

let sumMyList myList:int = List.sum myList

答案 1 :(得分:2)

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

您可以使用类型注释指定类型(并且来自@Gustavo的答案)显示您执行此操作时的所有选项。

另一个选项是将函数标记为inline,这样可以将它用于不同的类型(编译器将内联它,然后为每次使用函数选择实际类型):< / p>

let inline sumMyList myList = List.sum myList

答案 2 :(得分:0)

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

我突然想到了

[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

现在它按预期工作。