2011-05-20 239 views
6

如果我想定義一個類似於標準偏差的浮點數組的擴展方法,對於float[]類型的數組模塊或擴展使用模塊擴展會更好嗎? 喜歡:F#模塊擴展與類型擴展

module Array = 
    let std (arr: float[]) = ... 

type float ``[]`` with 
    member this.std = ... 

如果我做類型的擴展名,因爲後者,將在std只計算一次或每次使用時間呢?

而且,後者的正確格式是什麼,實際上type float ``[]`` with不是comile ...謝謝。

回答

5

在這種情況下,您無法定義類型擴展,所以問題沒有實際意義 - 您必須使用Array模塊的擴展。您無法定義類型擴展的原因是,在F#中,類型擴展必須與類型定義完全相同,因此您可以在通用'a list類型上定義類型擴展,但不能在類型string list上定義類型擴展。同樣,可以

'a ``[]`` 

但不是在構成陣列型的(模擬的)通用陣列型定義一個擴展方法

float ``[]`` 

此行爲是不同於C#,在那裏它可以寫入不同擴展方法構造的泛型類型。

+0

@kvb:你知道_why_他們在F#中的工作方式不同嗎? – Daniel 2011-05-20 14:15:32

+0

@丹尼爾 - 我不知道。但是,我認爲F#的行爲確實有道理 - 爲什麼不應該鍵入擴展鏡像類型定義?構造泛型類型的實例上的方法依賴於它的類型參數似乎並不奇怪嗎? – kvb 2011-05-20 14:21:14

+0

@kvb:是的,但它似乎對通用接口非常有意義。例如'string Join(這個IEnumerable 部分)'似乎是合理的。 – Daniel 2011-05-20 14:36:07