我刚刚开始学习F#,并尝试了来自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)
Run Code Online (Sandbox Code Playgroud)
输出是:
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:连续参数应该用spac es或tupled分隔,涉及函数或方法应用程序的参数应该用括号括起来
fstest2.fs(9,14):错误FS0374:赋值左侧的表达式无效
fstest2.fs(16,1):错误FS0010:定义中的意外标识符
猜猜错误是在let标签块的某个地方,但无法弄明白.
Bri*_*ian 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)
Run Code Online (Sandbox Code Playgroud)
in到处都是分号和s以及所有其他类型的句法噪音.让编辑器将标签转换为空格(并且拥有一个可以将空格视为标签的智能编辑器,例如,以便退格可以备份一个制表位),您可能会更高兴.
本主题已在此StackOverflow问题中进行了讨论.正如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
Run Code Online (Sandbox Code Playgroud)
有关更多讨论,请参阅此文章.