Programação ferroviária F #

Sep 17 2020

Estou tentando usar a programação ferroviária em F # usando o resultado, conforme descrito no livro de Scott Wlaschin, 'Modelagem de domínio tornada funcional'. Normalmente, uma função tem a estrutura

let functionName parameter : Result<ResultType, ErrorType> =
    result {
        let! resultValue = someValidationAndTransformation parameter
        return resultValue
    }

Mas quero retornar também alguns campos calculados, tanto para Ok quanto para o caso de Erro. O melhor que consegui pensar foi

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

Este campo mutável não parece bom. Existe uma maneira melhor de obter os campos calculados tanto no caso de Ok quanto no caso de Erro?

Respostas

2 sdgfsdh Sep 17 2020 at 17:07

Eu usaria um matchnesta situação:

let functionName parameter : Result<ResultType, ErrorType> * CalculatedFields =
  let result = someValidationAndTransformation parameter

  let calculatedFields = 
    match result with
    | Ok x -> someCalculation x
    | Error e -> { some defaultvalue }

  result, calculatedFields