意外的关键字' val'在定义中

时间:2014-11-08 15:08:42

标签: 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 
    | [] -> 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

有什么想法吗?

4 个答案:

答案 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)