2014-10-16 27 views
20

關鍵字的使用尋找有關靜態解析類型參數爲內聯函數我FSharp.Core偶然發現的various primitive operators定義信息:無證`when`在FSharp.Core

let inline (+) (x: ^T) (y: ^U) : ^V = 
    CheckedAdditionDynamic<(^T),(^U),(^V)> x y 
    when ^T : int32  and ^U : int32  = (# "add.ovf" x y : int32 #) 
    when ^T : float  and ^U : float  = (# "add" x y : float #) 
    // <snip> 
    when ^T : ^T = ((^T or ^U): (static member (+) : ^T * ^U -> ^V) (x,y)) 

如在片段中可以看出以上when關鍵字的格式爲:when expr1 = expr2各種內置類型。我猜這是某種編譯器等價的「如果T = int使用操作碼add.ovf,否則如果...,否則做」。

但是,我無法在F#文檔中找到這種語法的單個參考/解釋。是否有一些熟悉F#的人可以解釋上面代碼段中發生了什麼?

+2

請注意,您不能在標準F#中使用此語法(或'(#...#)'語法)。 – 2014-10-16 14:33:44

+5

下面是一些解釋:http://stackoverflow.com/questions/15968054/what-is-the-syntax-seen-in-f-standard-library-implementation/15968212#15968212 – 2014-10-17 00:15:06

+1

它似乎被稱爲靜態有條件的優化,我認爲它不應該在覈心庫之外使用 - 你可以看看你是否嘗試使用它並檢查編譯器錯誤;) – Carsten 2015-06-25 14:59:51

回答

2

用戶Carsten對此答案提供了以下評論,因爲他認爲這是錯誤的。

的事情是:使用when如這裏無關與 記錄的用途 - 它似乎被稱爲靜態條件 優化,不應核心庫之外使用 - 的確去和嘗試使用它 - 你會發現你不能,除非你 使用約翰回答(其它問題)

用戶卡斯滕加入到這一答案額外的評論中提到的招數:

我加了一個註釋 - 我不認爲我的猜測是值得的答案 - 我希望知情者遊逛一會終於把一個官方答案來

答案中提到的卡斯滕的第一個評論是由用戶約翰·帕爾默在2013年4月鏈接到這個答案,他設在(# ..... #)語法,What is the (# ... #) syntax seen in F3 standard library implementation?

實際上,你可以使用這個,但你必須指定 --compiling-fslib(無證)和--standalone旗幟你的代碼。

用戶MisterMetaphor給出了一個答案在一個論壇上引用一個帖子提到以下幾點:

在F#代碼嵌入IL。此功能是否正式支持?

不是真的。此功能的99.9%用途是在FSharp.Core.dll中定義的操作 (在1.9.2.9及以前稱爲fslib.dll)。

對於when關鍵字的其他用途,請參閱以下內容。

此Microsoft文檔描述了在匹配時使用when關鍵字的附加條件,Match Expressions (F#)

此Microsoft文檔描述了使用when關鍵字來表示泛型類型參數的約束,Constraints (F#)

另請參閱此Microsoft文檔描述與各種設置中的when關鍵字匹配的模式,Pattern Matching (F#)

模式匹配文件說明以下幾個例子。

模式是轉換輸入數據的規則。在整個F#語言中使用它們來將數據與邏輯結構或 結構進行比較,將數據分解爲組成部分或以各種方式從數據中提取信息 。

匹配表達式文檔說明以下內容以及示例。

您可以使用when子句來指定 變量必須滿足以匹配模式的附加條件。這樣一個條款被稱爲 作爲後衛。除非與關聯的模式匹配,否則不會評估when關鍵字後面的表達式 。

+0

你有足夠的代表來查看已刪除的問題嗎?因爲我可以將我的評論複製並粘貼到最後一個這裏......你在這裏描述的不是OPs問題中發生的事情(實際上那裏的評論已經回答了) - 你也不應該(僅)張貼鏈接 – Carsten 2015-06-25 13:46:31

+0

@Carsten ,我只看到一個問題和幾條評論,其中沒有一條似乎回答OP關於'when'關鍵字使用情況的問題,儘管一個鏈接到的是有關F#內核中使用的.NET操作碼插入的答案,現在非常罕見,不應該使用其他方式。指向其他文檔時鏈接始終是完全可以接受的,只要引用了相關章節。你爲什麼不復制你的評論,因爲除了這個評論,我什麼也看不到。 – 2015-06-25 14:49:49

+0

事情是這樣的:'when'用在這裏與文檔中的用法無關 - 它似乎被稱爲**靜態條件優化**,不應該在覈心庫之外使用 - 確實繼續並嘗試使用它 - 你會看到,除非你使用約翰斯回答(其他問題) – Carsten 2015-06-25 14:53:20