Programmation ferroviaire F #

Sep 17 2020

J'essaie d'utiliser la programmation ferroviaire en F # en utilisant le résultat comme décrit dans le livre de Scott Wlaschin «La modélisation de domaine rendue fonctionnelle». Normalement, une fonction a la structure

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

Mais je veux renvoyer également certains champs calculés, à la fois dans Ok et dans le cas d'erreur. Le mieux que je pouvais trouver était

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

Ce champ mutable n'a pas l'air sympa. Existe-t-il un meilleur moyen d'obtenir les champs calculés dans les cas Ok et Erreur?

Réponses

2 sdgfsdh Sep 17 2020 at 17:07

J'utiliserais un matchdans cette situation:

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