在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