У меня быстрый вопрос относительно дизайна и использования 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
Однако мне нужно будет написать функцию для каждого параметра, что довольно неудобно.