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