如何将操作与Functor结合起来?

时间:2015-05-20 13:22:47

标签: scala functional-programming

我在看category lecture

def getNames(users: List[User]) {
  users.map(_.name)
}

我在users计数中添加一个日志,因为它将我与List

联系起来很糟糕
def getNames(users: List[User]) {
  logger.info(users.count) // OMG tied up to List.
  users.map(_.name)
}

但这让我与list

联系起来

所以我使用functor

def getNames(users: A[USER], implicit functor: Functor[A]) {
  functor.map(users, u => u.name)
}

所以我理解可组合性的重要性,而不是为不属于的功能添加功能,我现在不理解的是我想要添加logging功能和其他功能(让& #39;显然我们确实需要这些功能...)我该如何以正确的可组合方式做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为我遵循你的目标(但不确定)。据说要实现该代码的可组合版本,我会做一些如下操作。但请注意,此示例可能矫枉过正,但为了简单表达我认为合适的概念。

1我定义了一个Logger monad trait,其map / flatMap执行日志记录。

2)实现一个覆盖flatMap的ListCountLogger案例类

3)然后将函数体改为this,其中countLogger返回monad:

def getNames( users: List[User]) {
    countLogger( users ).flatMap( _.name )
}

然后,您可以自由地为每个集合实现CountLoggers,因此不会与List“绑定”。