F#记录构造函数

时间:2014-08-24 09:42:39

标签: f# applicative fsharpx

有没有办法在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

1 个答案:

答案 0 :(得分:6)

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

你可以做的是使用标准的.NET反射(Activator.CreateInstance)或FSharp(FSharpValue.MakeRecordFSharpValue.PreComputeRecordConstructor来获取构建函数)。所有这些都希望将参数作为一个盒装对象的数组来获得,因此它不会很好地与应用验证相结合。

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