F# 详细语法和 class 定义问题

F# verbose syntax and class definition problem

我对 test.fsx 中以下代码给出的 fsharp 错误感到困惑:

let Kasper = "Kasper" in printfn "%A" Kasper
type student (name: string) =
  class
    member this.name = name
  end
let aStudent = student Kasper in printfn "%A" aStudent.name

出现以下错误,

% fsharpc test.fsx && mono test.exe
Microsoft (R) F# Compiler version 10.2.3 for F# 4.5
Copyright (c) Microsoft Corporation. All Rights Reserved.

/Users/sporring/Desktop/test.fsx(2,1): error FS0010: Unexpected keyword 'type' in implementation file
%

我找到了以下解决方案:

看来,我不了解 let-in 表达式的范围。有人能帮我理解为什么原始代码无法编译吗?谢谢。

F# 的冗长语法很奇怪,不鼓励使用它是有充分理由的:-)。

let .. in .. 构造是一个表达式,但模块中的顶层(当您还想使用 type 时需要它)表现不同。在模块级别,您可以使用 let 来定义顶级值,但这不是 let .. in .. 表达式,而是声明 let <pat> = <expr>。如果你想在模块初始化时运行一些代码,也可以在顶层使用do关键字,写成do <expr>。因此,为了使您的示例工作,您可以使用:

#light "off"
let Kasper = "Kasper" do printfn "%A" Kasper
type student (name: string) =
  class
    member this.name = name
  end
do let aStudent = student Kasper in printfn "%A" aStudent.name

为了显示更多选项,我将第一个 let 编写为顶级声明,但 aStudent 值被定义为 do 块中的本地绑定。