2010-04-30 60 views
11

我剛開始學習F#,並試圖從the wiki代碼:#indent「關」在F#

我更喜歡選項卡的空間,所以我改變一下代碼到這一點:

#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):error FS0010: 在 表達式中意外的關鍵字'let'或'use'。預期的'in'或其他 令牌。

fstest2.fs(13,1):錯誤FS0597: 連續參數應該由SPAC ES被 分離或tupled,和 參數涉及功能或方法 應用應當括號

fstest2.fs(9 ,14):錯誤FS0374:錯誤FS0010:在定義 意外標識符

01上左 分配

fstest2.fs(16,1)的 表達式無效

猜猜錯誤是在讓標籤塊的某處,但無法弄清楚。

+2

哈哈哈,只是證明寧願選項卡空格是錯誤的,錯誤的,錯誤的! :) – Benjol 2010-05-03 06:43:52

+9

@Benjol ... {angry-face-emoji} – stun 2011-03-21 22:24:18

回答

13

如果您使用「#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 s和所有其他類型的句法噪音無處不在。只要讓你的編輯器將標籤轉換爲空格(並且有一個智能編輯器,可以將空格看作是標籤,例如使退格可以備份一個標籤頁),你可能會更開心。

+0

在OCaml中,';;'在這裏不是必需的。 – Laurent 2011-04-11 13:36:45

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

+1

anta40說:「我更喜歡標籤空格」。不明白爲什麼選項卡不允許在F#中用於輕語法的縮進?想象一下,有人擁有他最喜歡的文本編輯器和一些文本工具,以及習慣多年來爲製表符進行打磨和拋光,而不是空間......現在F#只有兩種選擇:空格,光源開啓,製表符關閉。 – 2010-04-30 17:48:56

+4

@ anta40 - IIRC,問題是不同的編輯器可以使用不同寬度的製表符,也可以混合使用空格。由於對標籤寬度的更改可能會改變任何給定行的縮進級別,這也會改變程序本身的含義,導致很難注意到錯誤。 – 2010-05-01 00:36:17

+1

@JamesHugard選項卡本身就是一個字符。它沒有'寬度'。標籤寬度只是顯示文本的圖形概念。我同意混合標籤和空格可能會導致很難注意到錯誤。 – MEMark 2013-10-22 14:44:52