Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20250610 関数型DDD 11

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for saka saka
December 24, 2025
2

20250610 関数型DDD 11

Avatar for saka

saka

December 24, 2025

Transcript

  1. DDD

  2. ཁ • ೖྗ • 1τϥοΫͷؔ਺ • 2τϥοΫͷ஋ • ग़ྗ •

    2τϥοΫ • ͜ΕΛϥοϓͯ͋͛͠Δ • ೖྗΛ2τϥοΫɺग़ྗ΋2τϥοΫͷ ؔ਺ʹม͑ͯ͋͛Δ
  3. TS

  4. map

  5. ҧ͍ OkͰแΜͰฦ͍ͯ͠Δ ͖ͬ͞ͷ͸a->Result ͬͪ͜͸ a->b let map f aResult =

    match aResult with | Ok success -> Ok (f success) | Error failure -> Error failure
  6. let mapError f aResult = match aResult with | Ok

    success -> Ok success | Error failure -> Error (f failure)
  7. let functionA : FunctionA = ... let functionAWithFruitError input =

    input |> functionA |> Result.mapError (fun appleError -> AppleErrorCase appleError) ͜Ε͸࣍ͷΑ͏ʹ؆ུԽͰ͖·͢ɻ let functionAWithFruitError input = input |> functionA |> Result.mapError AppleErrorCase
  8. ߹੒Ͱ͖ΔΑ͏ʹͳͬͨ let functionAWithFruitError input = input |> functionA |> Result.mapError

    AppleErrorCase // "FruitError"Λ࢖༻͢ΔΑ͏ʹfunctionBΛม׵͢Δ let functionBWithFruitError input = input |> functionB |> Result.mapError BananaErrorCase // ৽͍ؔ͠਺͸ "bind" Ͱ߹੒Ͱ͖Δ let functionAB input = input |> functionAWithFruitError |> Result.bind functionBWithFruitError
  9. αϯϓϧఔ౓ʹ // PlaceOrderErrorΛฦ͢Α͏ʹม׵ͨ͠ let validateOrderAdapted input = input |> validateOrder

    // ݩͷؔ਺ |> Result.mapError PlaceOrderError.Validation // PlaceOrderErrorΛฦ͢Α͏ʹม׵ͨ͠ let priceOrderAdapted input = input |> priceOrder // ݩͷؔ਺ |> Result.mapError PlaceOrderError.Pricing ͜Ε͕ऴΘΔͱɺ࠷ऴతʹ bind Λ࢖ͬͯɺͦΕΒΛ࿈࠯ͤ͞ΒΕΔ let placeOrder unvalidatedOrder = unvalidatedOrder |> validateOrderAdapted // ม׵ޙͷؔ਺ |> Result.bind priceOrderAdapted // ม׵ޙͷؔ਺
  10. Try-catch AdapterͰResultܕ let serviceExceptionAdapter2 serviceInfo serviceFn x y = try

    Ok (serviceFn x y) with | :? TimeoutException as ex -> ... | :? AuthorizationException as ex -> ...
  11. // ('a -> unit) -> (Result<'a, 'error> -> Result<'a, 'error>)

    let adaptDeadEnd f = Result.map (tee f)