我刚开始学习F#,并尝试了the wiki的代码:
我更喜欢使用制表符空格,所以我将代码更改为:
#indent "off"
open System
open System.Windows.Forms
let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#")
let label =
let temp = new Label()
let x = 3 + (4 * 5)
temp.Text <- sprintf "x = %d" x
temp
form.Controls.Add(label)
[<STAThread>]
Application.Run(form)
输出结果为:
Microsoft(R)F#2.0编译器版本 4.0.30319.1版权所有(c)Microsoft Corporation。保留所有权利。
fstest2.fs(1,1):警告FS0062:这个 构造是为了ML兼容性。 考虑使用带扩展名的文件 '.ml'或'.mli'代替。您可以 通过使用禁用此警告 '--mlcompatibility'或'--nowarn:62'。
fstest2.fs(9,2):错误FS0010: 意外的关键字'let'或'use'in 表达。预期'在'或其他 令牌。
fstest2.fs(13,1):错误FS0597: 应该有连续的论据 由空间或元组分隔,和 涉及函数或方法的参数 应用括号内的应用程序
fstest2.fs(9,14):错误FS0374: 左边的表达式无效 分配
fstest2.fs(16,1):错误FS0010: 定义中的意外标识符
猜测错误位于 let label 块的某处,但无法弄明白。
答案 0 :(得分:16)
如果你使用“#indent off”,那么你将失去所有更简单的空白感知语法,并且必须回到使用例如。
#indent "off"
open System
open System.Windows.Forms
let label =
let temp = new Label() in
let x = 3 + (4 * 5) in
temp.Text <- sprintf "x = %d" x;
temp;;
let form =
let f = new Form() in
f.Controls.Add(label);
f;;
[<STAThread>]
do Application.Run(form)
用分号和in
以及所有其他类型的句法噪音到处都是。让编辑器将标签转换为空格(并且有一个可以将空格视为标签的智能编辑器,例如以便退格可以备份一个制表位),您可能会更高兴。
答案 1 :(得分:6)
此主题已经讨论过in this StackOverflow question。正如Brian解释的那样,关闭“轻量级”语法意味着您必须使用与OCaml兼容的语法进行编写。
我相信在大多数情况下,基于缩进的语法更具可读性(因此值得从制表符切换到空格)。但是,带有附加噪声的语法(例如in
和;;
)会更多地显示语言的结构,因此在学习F#时简单地使用它可能会很有用。
以下示例显示了您需要编写的所有其他内容:
let add a b c =
let ab = a + b in // 'in' keyword specifies where binding (value 'ab') is valid
printfn "%d" ab; // ';' is operator for sequencing expressions
c - ab;; // ';;' is end of a function declaration
有关更多讨论,see also this post。