我只是在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
现在可以按预期工作。