有没有办法在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
答案 0 :(得分:6)
F#记录实际上是使用构造函数生成的,但它似乎无法从F#代码中获得。可能CompilationMapping属性处理它,因为构造函数本身没有任何属性。
你可以做的是使用标准的.NET反射(Activator.CreateInstance
)或FSharp(FSharpValue.MakeRecord
,FSharpValue.PreComputeRecordConstructor
来获取构建函数)。所有这些都希望将参数作为一个盒装对象的数组来获得,因此它不会很好地与应用验证相结合。
我不认为你会得到比你现在更清洁的解决方案。