2015-01-26 59 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

相关问题