類型約束,該作品在F#4.0:訂購的F#中
type Something<'a, 'b when 'b :> seq<'b>>() =
這不:在類型名稱
type Something<'b when 'b :> seq<'b>, 'a>() =
意外的象徵 ''。預期的'>'或其他標記。
是什麼原因導致類型約束的順序很重要?
類型約束,該作品在F#4.0:訂購的F#中
type Something<'a, 'b when 'b :> seq<'b>>() =
這不:在類型名稱
type Something<'b when 'b :> seq<'b>, 'a>() =
意外的象徵 ''。預期的'>'或其他標記。
是什麼原因導致類型約束的順序很重要?
因爲它是在規範 - 相關的部分是這樣的(從第5款的開始):
typar-defns:= < typar-defn, ..., typar-defn typar-constraints_opt>
的約束需要去底。
在此typar-constraints
必須始終以when
開頭,並且不能出現在其他地方。
類型約束和類型參數是兩個不同的東西。在你的例子中,'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#中所犯的錯誤。
除了上面的答案,排序允許約束取決於多種類型。例如
type Something<'a, 'b when 'b :> seq<'a>>() =
注:seq<'a>
不seq<'b>
等待! '當'b:> seq <'b>'???這甚至意味着什麼? – Ray