在F#你可以如下定義first
功能:F#結構的元組與BCL的元組類型
let first (x, y) = x
你可以這樣調用:
first (1, 2)
您也可以定義BCL的功能相同Tuple
類型:
let first (t:Tuple<_, _ >) = t.Item1
但是,您可以使用現有的語法不調用它,否則你會收到以下錯誤:
error FS0001: The type ''c * 'd' is not compatible with the type 'Tuple<'a,'b>'
相反,你必須做到以下幾點:
first (Tuple<_,_>(1, 2))
這很奇怪,因爲在任何一種情況下編譯的F#代碼似乎都使用Tuple
來表示其參數。那麼爲什麼F#編譯器告訴我這些類型不兼容?
爲什麼有這件事?那麼,基本上我想寫一個重載支持任意長度的元組的方法。對於F#的語法元組來說這是不可能的,因爲必須事先知道參數的確切數量。但是,通過使用BCL Tuple
類型似乎是可能的,因爲那些使用TRest
技巧來允許任意長度的元組。不幸的是,如果我以這種方式編寫重載,那麼它們將不會與F#語法元組一起工作,這是最終目標。
所以我的問題是:爲什麼不是句法元組和BCL元組兼容?另外,是否有任何編寫F#中任意長度元組的函數和/或方法的例子?
特定的應用程序處理我正在寫的基於類型推斷的二進制解析庫。您可以查看代碼here。你可以看到我對元組有很多重載,但我不想將它們擴展到一些幻數。
是的,'FSharpValue'這個東西不能用於我想要的東西,因爲它失去了靜態類型。我想我會提供一堆重載。 – luksan