F# 铁路规划#
我试图在F#中使用railway编程,使用Scott Wlaschin的书《域建模功能化》中描述的结果。通常,函数具有以下结构F# 铁路规划#,f#,F#,我试图在F#中使用railway编程,使用Scott Wlaschin的书《域建模功能化》中描述的结果。通常,函数具有以下结构 let functionName parameter : Result<ResultType, ErrorType> = result { let! resultValue = someValidationAndTransformation parameter return resultValue } let
let functionName parameter : Result<ResultType, ErrorType> =
result {
let! resultValue = someValidationAndTransformation parameter
return resultValue
}
let functionName参数:结果=
结果{
让!resultValue=someValidationAndTransformation参数
返回结果值
}
但我还想返回一些计算字段,包括to Ok和Error两种情况。我能想出的最好办法就是
let functionName parameter : Result<ResultType, ErrorType> * CalculatedFields =
let mutable calculatedFields = {some defaultvalue}
let result =
result {
let! resultValue = someValidationAndTransformation parameter
let calculatedField = someCalculation resultValue
calculatedFields <- {calculatedFields with calculatedField}
return resultValue
}
result, calculatedFields
let functionName参数:结果*计算字段=
让可变计算字段={some defaultvalue}
让结果=
结果{
让!resultValue=someValidationAndTransformation参数
让calculatedField=someCalculation resultValue
计算字段在这种情况下,我将使用匹配项
:
let functionName参数:结果*计算字段=
让结果=someValidationAndTransformation参数
让计算字段=
匹配结果
|确定x->somex
|错误e->{some defaultvalue}
结果,计算字段
My pseudo code sample是真实代码的简化版本,但是真实代码可以重构为您的示例,这比将结果{..}交织起来更容易理解使用计算字段的计算进行表达式。如果您有更复杂的内容,那么您尝试过的嵌套结果
工作流是完全有效的。如果您需要在结果
工作流中处理两个方面,您还可以将let!
切换为let
。我知道,但当我尝试我最初的在没有在结果{..}表达式之前声明可变变量的情况下,最后一条语句不识别calculatedFields(这将在结果{..}表达式中定义)