Eisenbahnprogramm F #

Sep 17 2020

Ich versuche, die Eisenbahnprogrammierung in F # unter Verwendung des Ergebnisses zu verwenden, wie in Scott Wlaschins Buch 'Domain Modeling made Functional' beschrieben. Normalerweise hat eine Funktion die Struktur

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

Ich möchte aber auch einige berechnete Felder zurückgeben, sowohl in Ok als auch im Fall Error. Das Beste, was ich mir einfallen lassen konnte, war

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

Dieses veränderliche Feld sieht nicht gut aus. Gibt es eine bessere Möglichkeit, die berechneten Felder sowohl im OK- als auch im Fehlerfall abzurufen?

Antworten

2 sdgfsdh Sep 17 2020 at 17:07

Ich würde matchin dieser Situation ein verwenden:

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