Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 有没有一种简单的方法可以继承计算表达式行为?_F#_Computation Expression - Fatal编程技术网

F# 有没有一种简单的方法可以继承计算表达式行为?

F# 有没有一种简单的方法可以继承计算表达式行为?,f#,computation-expression,F#,Computation Expression,如何构建一个新的计算表达式,该表达式继承了现有表达式的大多数行为,但可能需要覆盖某些行为 上下文: 从现在起,我将使用CE作为计算表达式的缩写 我正在使用 我有一个“分层”应用程序,其中包含一个从数据库层获取的存储库 到目前为止,数据库层中的所有函数都返回Task>,其中RepositoryError可以很容易地从DatabaseError中派生出来,这意味着我的大多数代码如下所示: 让getAll con offset chunk=taskResult{ 让我们来看看产品= ProductEn

如何构建一个新的计算表达式,该表达式继承了现有表达式的大多数行为,但可能需要覆盖某些行为

上下文:

从现在起,我将使用CE作为计算表达式的缩写

我正在使用

我有一个“分层”应用程序,其中包含一个从数据库层获取的存储库

到目前为止,数据库层中的所有函数都返回
Task>
,其中
RepositoryError
可以很容易地从
DatabaseError
中派生出来,这意味着我的大多数代码如下所示:

让getAll con offset chunk=taskResult{
让我们来看看产品=
ProductEntity.allPaginated偏移块con
|>TaskResult.mapError RepositoryError.fromDatabaseError
让我数一数=
ProductEntity.countAll con
|>TaskResult.mapError RepositoryError.fromDatabaseError
返回{Items=products;TotalCount=TotalCount}
}
目标:

  • 我希望所有那些
    TaskResult.mapError RepositoryError.fromDatabaseError
    调用都能在新的CE内部进行。我们称之为
    repoTaskResult{…}
  • 我需要拥有原始
    taskResult{…}
    CE的所有当前功能
  • 让getAll con offset chunk=repoTaskResult{
    让!products=ProductEntity.allPaginated offset chunk con
    让!totalCount=ProductEntity.countAll con
    返回{Items=products;TotalCount=TotalCount}
    }
    
    编辑:

    A.试图用继承来解决它(但是推断正确的类型不起作用)

    类型RepositoryTaskResultBuilder()=
    继承TaskResultBuilder()
    成员绑定(databaseTaskResult:Task>)


    如果您希望通过将return语句替换为
    return!Result.Ok{Items=products;TotalCount=TotalCount}来帮助进行类型推断
    ,那么您就可以开始了,因为之前的let!语句正确地使用了新实现的Bind方法。

    您是否尝试过从task builder继承CE builder类?是的,但我没有找到重写Return member函数的方法,在子类化的情况下,这似乎是必需的。我还尝试了composi替代继承,如:创建一个新的CE builder,接收TaskResultBuilder的实例并对其调用方法。这很容易实现目标1,但问题是我需要重新实现并委托TaskResultBuilder的所有其他方法来实现目标2。我也不知道拥有CE builder是否“安全”“拥有”另一个CE builder。您能发布继承解决方案的代码并描述您遇到的问题吗?@FyodorSoikin添加了继承版本