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 | [] -

学习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 
    | [] -> 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]