F#中#indent“off”

时间:2010-04-30 15:41:47

标签: f# indentation

我刚开始学习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 块的某处,但无法弄明白。

2 个答案:

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