2010-06-07 50 views
2

我剛將原型組元升級到記錄。有一天它可能會成爲一個真正的階級。在此期間,我想這樣的轉換代碼:F#高階屬性訪問器

type Example = int * int 
let examples = [(1,2); (3,4); (5,6)] 
let descs = Seq.map (fst >> sprintf "%d") examples 

這樣:

type Example = { 
    Field1 : int 
    Field2 : int 
    Description : string 
} 
let examples = [{Field1 = 1; Field2 = 2; Description = "foo"} 
       {Field1 = 3; Field2 = 4; Description = "bar"} 
       {Field1 = 5; Field2 = 6; Description = "baz"}] 
let descs = Seq.map Description examples 

的問題是,我希望得到一個功能Description : Example -> string當我宣佈實例記錄,但我不「T。我探討了一些並嘗試過類的屬性,但這也不起作用。我是否在文檔中遺漏了某些內容,或者是否需要手動編寫高階訪問器? (這是我現在使用的解決方法。)

回答

8

我同意在F#中有一些使用實例成員作爲函數值的方法(不需要顯式構造lambda函數)。這已經在F#社區中實際討論了幾次。這裏有一個相關鏈接:

從討論的一些建議的選項有:

// This would turn '_' automatically into a lambda parameter 
// (this looks okay in simple cases, but doesn't probably scale well) 
examples |> Seq.map (_.Description) 

// You would specify instance member using special '#' symbol 
examples |> Seq.map (Example#Description) 

所以,這一點是在F#團隊是知道的,但我不要認爲這是否確實是這個重要特徵,以及支持它的最佳方式是什麼。

0
examples |> Seq.map (fun e -> e.Description) 

(聲明一個記錄不產生任何關聯的功能,但是記錄有屬性,所以像上面一個微小的拉姆達可以輕鬆投射出的某些字段。 )

+0

嗯,這是我在談論的解決方法。在呼叫站點編寫高階訪問器是冗長的,並且在記錄聲明之後寫入它很容易忘記。 – 2010-06-07 20:56:34

+0

好的(「高階訪問器」在這裏是一個奇怪的標籤; lambda不是高階的)。是的,如果有「fun x - > x」的簡寫語法,那將會很不錯。因爲這是一個常見的習慣用法。 – Brian 2010-06-07 20:59:31

+0

是的,在短時間內我想不出一個更好的名字。 – 2010-06-07 21:10:07