Результат и дизайн предметной области в F # - PullRequest
0 голосов
/ 11 декабря 2018

У меня быстрый вопрос относительно дизайна и использования Result.Я прочитал отличные статьи на FSharpForFunAndProfit , касающиеся Железнодорожно-ориентированного программирования , и оно действительно соответствует моим потребностям, так как мне нужен доступ к данным в БД, и некоторые данные могут быть недоступны (и поэтомусоздать ошибку).

Допустим, у меня есть следующий домен

type Main = A * B
type B =
{ B1 of float
  B2 of string } // or any type, just took 2 simple ones)

Если я не использую Result, я могу легко получить доступ ко всему из основного: Main:

let a = main |> fst
let b1 = (snd B).B1

Однако, скажем, я хочу использовать создание Main с использованием такой функции, как эта

val createMain : x:sometihng -> Result<Main, 'T>

Тогда я знаю, что для доступа, скажем, к A в этом главном объекте (в случае Result.Ok), Я могу использовать следующее:

    let fail x = 
        Result.Error x

    let succeed x = 
        Result.Ok x

    let either successFunc failureFunc twoTrackInput =
        match twoTrackInput with
        | Result.Ok s -> successFunc s
        | Result.Error f -> failureFunc f   

    let map f = 
        either (f >> succeed) fail

В этом случае я могу написать следующее:

let a = main |> map fst

И я получу

Result<A, 'T>

Нокак я могу легко получить доступ к b1?Я знаю, что могу написать такую ​​функцию, как

let getB1 main =
    match main with
    | Result.Ok -> (snd main).B1
    | Result.Error t -> Result.Error t

Однако мне нужно будет написать функцию для каждого параметра, что довольно неудобно.

1 Ответ

0 голосов
/ 11 декабря 2018

Вам нужно написать некоторую функцию, которая принимает тип Main, и сопоставить ее с типом Result.

Другими словами, просто напишите несколько функций, которые работают с вашими базовыми типами, а затем сопоставьте / свяжите их сваш тип результатов в зависимости от ситуации.

Итак, что бы вы ни хотели сделать, напишите функцию, которая делает это для вашего базового типа.Затем на уровне, где у вас есть тип результата, сопоставьте ему функцию.

Таким образом, на более высоком уровне вы вводите результат и выводите другой результат.На нижнем уровне вы работаете с базовыми типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...