2015-01-26 62 views
3

在Haskell,鑑於這種記錄:是否有可能將F#記錄的標籤用作Haskell中的函數或類似的函數?

data ARecord { labelA :: String, labelB :: Int } 

我們得到這個功能:

labelA :: ARecord -> String 
labelB :: ARecord -> Int 

F#似乎並沒有這樣的工作方式。但是,有沒有類似的東西?

編輯

按類似於我的意思的東西,節省了我不必手動定義功能,@kaefer建議什麼的。

+3

不,這在今天的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

+0

我添加了我的投票。謝謝! – 2015-01-27 01:31:02

回答

2

它很容易定義。

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 
+0

對不起,我還不夠清楚。不得不手動定義函數正是我想要避免的。我編輯了這個問題。 – 2015-01-26 18:46:35

+0

@LayGonzález我推測在F#中訪問記錄字段的首選方式是通過「記錄模式」或類似財產的點符號。 – kaefer 2015-01-26 19:25:03

+0

我同意它非常方便。然而,我們不可能有兩種選擇嗎?如果沒有手動定義函數,則不能執行如下操作:'a |> labelA' – 2015-01-26 21:47:39

相關問題