2010-11-06 24 views
6

有時在書本上我看到這個語法在F#名單和順序內涵:爲什麼在F#解析中棄用「 - >」?

seq { for i = 0 to System.Int32.MaxValue -> i } 

這是Programming F# by Chris Smith,第80頁。在附帶的VS2010 F#,這並不編譯。我相信->已被棄用。 (見Alternative List Comprehension Syntax)。然而,->仍然可以在涉及範圍推導使用:

seq { for c in 'A' .. 'Z' -> c } 

Expert F# 2.0,第58頁,這是因爲->是簡寫Seq.map在一定範圍內。

  1. 爲什麼上面第一次使用->不推薦使用?
  2. 目前使用->似乎不一致。任何人都可以協調這對我嗎?

    seq { for <binding> in <input> -> <projection> } 
    

    第一個例子你:

回答

10

->構建體僅在你在一些數據源使用以下結構做一個凸起(Seq.map)「簡單」序列表達式語法支持上面提到的是使用for .. to ..這是一個與for .. in不同的語法結構,但是您可以使用第二個重寫它(實際上,在編寫序列表達式時,我幾乎總是使用for .. in):

seq { for i in 0 .. System.Int32.MaxValue -> i } 

在所有其他形式的序列表達式中,您必須使用yield。在早期版本的F#中,->語法相當於yield(並且還有->>,相當於yield!)。因此,例如,你能寫:

seq { -> 10    // You need 'yield' here 
     ->> [ 1; 2; 3 ] } // You need 'yield!' here 

這個語法看起來很奇怪,所以我認爲製作這兩個棄用的主要原因是保持語言相一致。同樣的計算表達式語法用於順序表達式(其中->有一定意義),但也適用於其他計算類型(並且您可以自己定義),其中yield感覺更合適(並且它也對應於異步工作流中的return或其他計算表達式)。

「簡單」特定於序列的語法仍然有用,因爲它可以節省您一些打字的時間(您可以用->替代do yield),但是在更復雜的情況下,您不會保存那麼多字符,我認爲語法使用-> & ->>看起來有點神祕。

相關問題