F#中#indent"off"

ant*_*a40 12 f# indentation

我刚刚开始学习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以及所有其他类型的句法噪音.让编辑器将标签转换为空格(并且拥有一个可以将空格视为标签的智能编辑器,例如,以便退格可以备份一个制表位),您可能会更高兴.


Tom*_*cek 6

本主题已在此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)

有关更多讨论,请参阅此文章.

  • @ anta40 - IIRC,问题是不同的编辑器可以使用不同宽度的制表位,也可以混合空格.由于更改选项卡宽度可能会更改任何给定行的缩进级别,这也可能会更改程序本身的含义,从而导致很难发现错误. (5认同)
  • 选项卡和空格的混合对于控制结构是不负责任的,但考虑到即使Python允许在任何唯一的范围级别中的一个或另一个,F#完全禁止选项卡也是荒谬的. (5认同)
  • anta40说:“与空格相比,我更喜欢使用制表符”。尚不清楚为什么在F#中不允许使用制表符来缩进简短的语法?想象一下,有人有他最喜欢的文本编辑器和一些文本工具,只是习惯了多年的制表符,而不是空格的养成和完善……现在F#只有两种选择:空格亮起,tabs熄灭。 (2认同)