学习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
我得到(第5行):
Error 1 Unexpected keyword 'val' in definition . Expected incomplete structured construct at or before this point or other token
有什么想法吗?
答案 0 :(得分:2)
F#中的val
关键字(与ML中的'val'不同)用于声明类或结构类型中的字段而不初始化它。
http://msdn.microsoft.com/en-us/library/dd469494.aspx
如果你想在模块中定义可变值,你可以使用
let mutable...
顺便说一句,如果您使用相同的名称(如'nums')定义值两次或更多次,那么编译器的有效值将在范围内最新定义。
答案 1 :(得分:1)
实际上,我误读了所设定的课程,令人烦恼的是,论文使用val来定义函数的预期输出,而不是将其用作关键字。因此我的困惑和许多头部刮伤。
答案 2 :(得分:1)
这看起来像 F#交互式输出与代码混合。
如果我输入FSI:
let nums = [1; 2; 3; 4; 5];;
输出
val nums : int list = [1; 2; 3; 4; 5]
请注意;;
是FSI解析并运行输入的地方。你不会在非交互式代码中有这个。由于版本较旧或编辑,输出可能会有所不同,但是,它并不属于代码。
巧合的是,val
也很少使用F# keyword for explicit fields。因此奇怪的错误信息。
答案 3 :(得分:0)
val关键字用于声明字段;它必须在类型定义(类或结构)中使用。由于在您的代码中已经定义了变量 nums ,并且作为由F#类型推理引擎推断的列表类型,因此不需要您的val行。
val关键字用法的一个例子是(来自msdn):
type MyType() =
let mutable myInt1 = 10
[<DefaultValue>] val mutable myInt2 : int
[<DefaultValue>] val mutable myString : string
member this.SetValsAndPrint( i: int, str: string) =
myInt1 <- i
this.myInt2 <- i + 1
this.myString <- str
printfn "%d %d %s" myInt1 (this.myInt2) (this.myString)