2013-03-23 213 views
10

F#類型擴充和類型擴展的區別究竟是什麼,我們是否真的需要這兩者?F# - 類型擴充VS類型擴展

是否有情況下一個比另一個好,反之亦然?

我在問,因爲我最近在F#上做了一個演講,演講者談論了這兩個問題,之後他評論說他看不到兩人都被包含在F#語言中的原因。

更新:

好了,弗拉季Zorov鏈接到一個網頁使用型增強的例子都定義在自己的類型,並延伸(或增加?)外部類型。

鏈接到MSDN頁面,他們稱之爲內在的和可選的類型的擴展名

兩者似乎都說明了同樣的事情。也許有人可以用類型擴展類型增加的另一個具體示例來具體示例,以便明確說明兩件事情究竟是什麼?

+0

你似乎把我們混在一起:)我連接到托馬斯佩特里切克的博客,連同喬恩Skeet和尹朱他們寫這個 - http://manning.com/petricek/,這是恕我直言最偉大的一個,關於F#的最詳細的書籍。 – 2013-03-26 16:13:34

+0

哎呦,你說的對,我修好了。 :-) – phaz 2013-03-26 20:01:56

回答

9

MSDN's Type Extensions page以下位相關(重點煤礦):

有兩種形式類型擴展名是具有略微不同的 語法和行爲。 內部擴展是 與擴展的 類型在同一個程序集(DLL或可執行文件)中出現在同一個名稱空間或模塊中,同一源文件中和 中的擴展名。 可選擴展程序是一個擴展,它出現在 以外的原始模塊,名稱空間或類型爲 的擴展程序集。 當反射檢查類型爲 時,內部擴展名會顯示在類型上,但可選擴展名不會。可選 擴展名必須位於模塊中,並且只有在包含擴展名的 模塊處於打開狀態時,它們才處於範圍內。

可選擴展的目的很明確。它可以幫助您爲不屬於組件的類型注入新功能。有關示例,FSharpx用它來解析基本類型創建various helpers

open System 

type Boolean with 
    static member parse x = 
     match bool.TryParse(x) with 
     | true,v -> Some v 
     | _ -> None 

爲什麼你需要內在的擴展呢?答案是它的方便。我發現將類型定義分解爲具有明確目的的多個部分很有用。

在很多F#庫中,我看到使用了以下模式:類型定義 - >實用函數 - >內部擴展。通過這種方式,您可以在類型上定義複雜的實用程序函數,使它們在模塊中可用,並且仍然可以直接在您的成員定義中使用它們。您可以查看F#PowerPack中的Complex type以查看模式。

編輯:

說實話,我經常使用類型擴展型增強互換。重要的是它們是內在的還是可選的。

4

他們是不同的東西。當在同一個命名空間中定義的類型擴充,模塊和源文件,實際上在編譯時成爲類型的一部分。類型擴展(用於模塊和源文件之外類型的a.k.a.類型擴展)用.NET擴展方法實現。

它們都使用相同的語法,唯一的區別是您提到的類型是否位於相同的名稱空間和程序集中,即您正在擴充自己的代碼,並且在編譯之前可以將其他方法添加到類型中。

來源:http://tomasp.net/blog/fsharp-iii-oop.aspx

編輯:

這是一個術語混淆,它們都指的是同一件事 - 內在擴展型擴充第一種(即相同的命名空間和程序集),可選擴展類型增補的第二種(即第三方大會,在博客文章這是List<T>增強示例)。

當你的講師在談論型擴充我認爲,他指的是內在的擴展,即第一種類型的擴充,而當他在談論類型擴展,他在談論可選的擴展,或第二種類型的擴充。