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
%
我找到了以下解决方案:
- 将
printfn "%A" Kasper.name;
移到新行
- 将整个结构
let Kasper = "Kasper" in printfn "%A" Kasper
移到类型定义下方
- 将其全部转换为轻量级语法
看来,我不了解 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
块中的本地绑定。
我对 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
%
我找到了以下解决方案:
- 将
printfn "%A" Kasper.name;
移到新行 - 将整个结构
let Kasper = "Kasper" in printfn "%A" Kasper
移到类型定义下方 - 将其全部转换为轻量级语法
看来,我不了解 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
块中的本地绑定。