2016-05-31 76 views
3

類型約束,該作品在F#4.0:訂購的F#中

type Something<'a, 'b when 'b :> seq<'b>>() = 

這不:在類型名稱

type Something<'b when 'b :> seq<'b>, 'a>() = 

意外的象徵 ''。預期的'>'或其他標記。

是什麼原因導致類型約束的順序很重要?

+0

等待! '當'b:> seq <'b>'???這甚至意味着什麼? – Ray

回答

9

因爲它是在規範 - 相關的部分是這樣的(從第5款的開始):

typar-defns:= < typar-defn, ..., typar-defn typar-constraints_opt> 

的約束需要去底。

在此typar-constraints必須始終以when開頭,並且不能出現在其他地方。

4

類型約束和類型參數是兩個不同的東西。在你的例子中,'a'b是兩個類型參數,而when 'b :> seq<'b>是(唯一)約束。

現在,您編寫第一個示例的方式似乎表明類型參數定義與類型約束有關,但這只是外觀。注意這個(工作)代碼:

type Something<'b, 'a when 'b :> seq<'b>>() = 
    member this.A (a : 'a, b : 'b) = 
    () 

首先,你定義所有的類型參數。之後纔出現類型約束,約束仍然適用於'b,而不是'a - 雖然看起來有點令人困惑,但約束表達式不是'a when 'b :> seq<'b>,它只是when 'b :> seq<'b>

這實際上是幾乎相同的,如C#,其他.NET語言:

public class Something<TA, TB> where TA: someConstraint where TB: someOtherConstraint 

約束是更直觀的C#分開的,這樣的人不傾向於讓你在F#中所犯的錯誤。

1

除了上面的答案,排序允許約束取決於多種類型。例如

type Something<'a, 'b when 'b :> seq<'a>>() = 

注:seq<'a>seq<'b>