在Haskell,鑑於這種記錄:是否有可能將F#記錄的標籤用作Haskell中的函數或類似的函數?
data ARecord { labelA :: String, labelB :: Int }
我們得到這個功能:
labelA :: ARecord -> String
labelB :: ARecord -> Int
F#似乎並沒有這樣的工作方式。但是,有沒有類似的東西?
編輯
按類似於我的意思的東西,節省了我不必手動定義功能,@kaefer建議什麼的。
在Haskell,鑑於這種記錄:是否有可能將F#記錄的標籤用作Haskell中的函數或類似的函數?
data ARecord { labelA :: String, labelB :: Int }
我們得到這個功能:
labelA :: ARecord -> String
labelB :: ARecord -> Int
F#似乎並沒有這樣的工作方式。但是,有沒有類似的東西?
編輯
按類似於我的意思的東西,節省了我不必手動定義功能,@kaefer建議什麼的。
它很容易定義。
type ARecord = { labelA : string; labelB : int }
let labelA { labelA = s } = s
// val labelA : ARecord -> string
編輯
下面的函數將編譯爲相同IL,以及直接讀訪問後備字段,而不是自動產生實例屬性。 與面向對象的點符號的常規體驗相反,它不需要類型註釋來確定記錄類型。
let labelA' aRecord = aRecord.labelA
// val labelA' : aRecord:ARecord -> string
對不起,我還不夠清楚。不得不手動定義函數正是我想要避免的。我編輯了這個問題。 – 2015-01-26 18:46:35
@LayGonzález我推測在F#中訪問記錄字段的首選方式是通過「記錄模式」或類似財產的點符號。 – kaefer 2015-01-26 19:25:03
我同意它非常方便。然而,我們不可能有兩種選擇嗎?如果沒有手動定義函數,則不能執行如下操作:'a |> labelA' – 2015-01-26 21:47:39
不,這在今天的F#中是不可能的。增加對此的支持(不僅對於記錄,而且對於常規的.NET類型也是如此)*頂部F#[語言功能請求](https://fslang.uservoice.com/forums/245727-f-language/suggestions/ 5663326-syntax-for-turning-properties-into-functions)。 – latkin 2015-01-27 00:35:41
我添加了我的投票。謝謝! – 2015-01-27 01:31:02