关于设计和使用结果,我有一个简短的问题。我已经阅读了有关FSharpForFunAndProfit的优秀文章,它实际上符合我的需要,因为我需要访问DB中的数据,有些数据可能是不可用的(因此创建一个错误)。
假设我有以下域
type Main = A * B
type B =
{ B1 of float
B2 of string } // or any type, just took 2 simple ones)如果不使用结果,则可以轻松地访问Main的所有内容: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但是,我需要为每个参数编写一个函数,这是非常不方便的。
发布于 2018-12-11 09:53:05
您需要编写一些接受Main类型的函数,并将其映射到结果类型。
换句话说,只需编写一堆在基类型上操作的函数,然后根据需要将它们映射/绑定到结果类型。
因此,无论您想做什么,都要编写一个函数来完成它的基本类型。然后,在有结果类型的级别上,将函数映射到它。
因此,在更高的层次上,您输入一个结果并输出一个不同的结果。在较低级别上,您使用基本类型。
https://stackoverflow.com/questions/53719149
复制相似问题