F# 意外关键字';val';顾名思义
学习F#是我课程的一部分,可以做一些很酷的事情,但有些事情一直困扰着我,每当我使用val关键字时,我都会出错。我想这可能是因为没有在脚本中声明一些东西,但我真的不知道F# 意外关键字';val';顾名思义,f#,F#,学习F#是我课程的一部分,可以做一些很酷的事情,但有些事情一直困扰着我,每当我使用val关键字时,我都会出错。我想这可能是因为没有在脚本中声明一些东西,但我真的不知道 module Prime #light let nums = [1; 2; 3; 4; 5];; val nums : list<int> let rec sum list = match list with | h::tail -> (sum tail) + h | [] -
module Prime
#light
let nums = [1; 2; 3; 4; 5];;
val nums : list<int>
let rec sum list =
match list with
| h::tail -> (sum tail) + h
| [] -> 0
val sum : list<int> -> int
有什么想法吗?F#中的
val
关键字(与ML中的“val”不同)用于在类或结构类型中声明字段,而无需初始化它
如果要在模块中定义可变值,可以使用
let mutable...
顺便说一句,如果您使用相同的名称(如“nums”)定义值两次或多次,那么编译器的有效值将是范围中定义的最新值 val关键字用于声明字段;它必须在类型定义(类或结构)中使用。由于在代码中变量nums已经定义,并且是由F#type推断引擎推断的列表类型,因此不需要val行 val关键字用法的一个示例是(来自msdn):
type MyType()=
设可变myInt1=10
[]val可变myInt2:int
[]val可变myString:string
成员this.SetValsAndPrint(i:int,str:string)=
myInt1因此,实际上,我误读了列出的课程,令人恼火的是,论文使用val来定义函数的预期输出,而不是将其用作关键字。因此,我感到困惑和挠头 这看起来像是F#交互式输出与代码混合在一起
如果我将其输入FSI:
let nums = [1; 2; 3; 4; 5];;
输出是
val nums : int list = [1; 2; 3; 4; 5]
请注意,代码>是FSI解析和运行输入的地方。在非交互式代码中不会出现这种情况。由于旧版本或编辑,输出可能会有所不同,但并非如此,它不属于代码
巧合的是,val
也很少使用。因此出现了奇怪的错误消息。这就是我从代码中怀疑的。作为旁注,#light
是自F#2.0以来的默认值,不再需要添加它。您阅读的文档没有使用val定义输出,而是添加了中间输出,可能来自旧版本的F#interactive。有关详细信息,请参阅我的答案。这并不能提供问题的答案。若要评论或要求作者澄清,请在其帖子下方留下评论。正确,但不是答案。这只是巧合,这个问题的val
,它是fsi的输出,也是一个关键字。我建议删除此答案,因为搜索此答案的人可能不会为显式字段寻找相当模糊的关键字。对不起,我不能同意您的意见。他徘徊在“每当我使用'val'关键字时,我都会得到一个错误。”他提到的编译器错误清楚地表明,他希望在F#程序中使用这个声明(可能是从FSI输出中复制的)。我的答案是关于在F#中,“val”关键字在哪里有效,应该在F#中使用。
let nums = [1; 2; 3; 4; 5];;
val nums : int list = [1; 2; 3; 4; 5]