我只是在涉及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类型列表?
答案 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
现在它按预期工作。