首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用Kleisli减少样板

如何用Kleisli减少样板
EN

Stack Overflow用户
提问于 2016-03-17 13:35:26
回答 2查看 62关注 0票数 1

我遵循“功能和反应性领域建模”一书的设计。

对于某些服务方法,它只将工作委托给存储库层。有没有办法减少这个样板:

代码语言:javascript
运行
复制
trait FeedbackServiceImpl extends FeedbackService {
  override def saveTFE(feedback: TripFeedbackEvent) =
    Kleisli[Future, Context, Either[String, Id]] { ctx => ctx.feedbackRepo.save(feedback) }

  override def saveLFE(feedback: LibraryFeedbackEvent) =
    Kleisli[Future, Context, Either[String, Id]] { ctx => ctx.feedbackRepo.save(feedback) }

  override def findByUser(userId: Id) =
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.findByUser(userId) }

  override def all =
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.all }

  override def findByTip(tipId: Id) =
    Kleisli[Future, Context, Seq[FeedbackEvent]] { ctx => ctx.feedbackRepo.findByTip(tipId) }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-01 19:09:05

我们可以创建一个组合器:

private def kleisli[M[_], A](f: FeedbackRepository => M[A]) = Kleisli.kleisli(f).local[Context](_.feedbackRepo)

因此,我们得到了两件事:

  • 通过帮助类型推理机制避免声明类型
  • 避免使用ctx.feedbackRepo调用local

所以我们可以用:

代码语言:javascript
运行
复制
trait Feedbacks {
  def saveTFE(feedback: TripFeedbackEvent) = kleisli(_.save(feedback)) 
  def saveLFE(feedback: LibraryFeedbackEvent) = kleisli(_.save(feedback))
  def findByUser(userId: Id) = kleisli(_.findByUser(userId))
  ...
}
票数 1
EN

Stack Overflow用户

发布于 2016-04-01 04:50:57

你能定义一个函数来做所有的样板吗?类似于:

代码语言:javascript
运行
复制
def repo2Kleisli[T](f: Repo => Future[T]): Kleisli[Future, Context, T]

您甚至可以将其隐式化,并将代码简化为如下所示:

代码语言:javascript
运行
复制
 override def saveTFE(feedback: TripFeedbackEvent) = (repo: Repo) => repo.save(feedback)
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36062143

复制
相关文章

相似问题

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