6

有没有办法在 F# 中调用 F# 记录类型的构造函数?

我的动机是我一直在使用 FSharpx 的应用验证,但发现自己编写了许多只构建记录的样板函数。

buildAddress 函数例如在简单的样板中,如果可能的话,我很想摆脱它。

       let buildAddress streetNumber streetLine1 streetLine2 suburb state postcode =
            {
                Address.StreetNumber = streetNumber
                StreetLine1 = streetLine1
                StreetLine2 = streetLine2
                Suburb = suburb
                State = state
                Postcode = postcode
            }

       let validateAddress streetNumber streetLine1 streetLine2 suburb state postcode =
            buildAddress 
                <!> isNumber streetNumber 
                <*> Success streetLine1 
                <*> Success streetLine2 
                <*> Success suburb 
                <*> Success state
                <*> validatePostcode postcode
4

1 回答 1

6

F# 记录实际上是使用构造函数生成的,但似乎无法从 F# 代码中获得。可能 CompilationMapping 属性可以处理这个问题,因为构造函数本身没有任何属性。

您可以做的是使用标准.NET反射Activator.CreateInstance(然而,他们所有人都希望将参数作为一个装箱对象的数组来获取,因此它与应用验证不能很好地结合。FSharpValue.MakeRecordFSharpValue.PreComputeRecordConstructor

我认为您不会得到比现在更清洁的解决方案。

于 2014-08-24T10:34:40.083 回答