首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >F#中的结果与领域设计

F#中的结果与领域设计
EN

Stack Overflow用户
提问于 2018-12-11 07:16:31
回答 1查看 65关注 0票数 1

关于设计和使用结果,我有一个简短的问题。我已经阅读了有关FSharpForFunAndProfit的优秀文章,它实际上符合我的需要,因为我需要访问DB中的数据,有些数据可能是不可用的(因此创建一个错误)。

假设我有以下域

代码语言:javascript
复制
type Main = A * B
type B =
{ B1 of float
  B2 of string } // or any type, just took 2 simple ones)

如果不使用结果,则可以轻松地访问Main的所有内容:Main:

代码语言:javascript
复制
let a = main |> fst
let b1 = (snd B).B1

但是,假设我想使用像这样的函数来创建一个Main

代码语言:javascript
复制
val createMain : x:sometihng -> Result<Main, 'T>

然后,我知道要访问这个主对象中的A(在Result.Ok中),我可以使用以下方法:

代码语言:javascript
复制
    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

在这种情况下,我可以写以下内容:

代码语言:javascript
复制
let a = main |> map fst

我会得到一个

代码语言:javascript
复制
Result<A, 'T>

但是如何才能轻松地访问b1呢?我知道我可以写一个函数

代码语言:javascript
复制
let getB1 main =
    match main with
    | Result.Ok -> (snd main).B1
    | Result.Error t -> Result.Error t

但是,我需要为每个参数编写一个函数,这是非常不方便的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-11 09:53:05

您需要编写一些接受Main类型的函数,并将其映射到结果类型。

换句话说,只需编写一堆在基类型上操作的函数,然后根据需要将它们映射/绑定到结果类型。

因此,无论您想做什么,都要编写一个函数来完成它的基本类型。然后,在有结果类型的级别上,将函数映射到它。

因此,在更高的层次上,您输入一个结果并输出一个不同的结果。在较低级别上,您使用基本类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53719149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档