如何结合Functor进行运算?

How to combine operation with Functor?

我在看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 功能和其他功能(让我们显然我们确实需要这些功能......)我该怎么做才能以适当的可组合性方式做到这一点?

我认为我遵循了你所追求的(但不确定)。话虽如此,为了实现该代码的可组合版本,我将执行以下操作。但是,请注意,对于此示例,它可能 矫枉过正 但为了简单地表达概念,我认为它是合适的。

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

2) 实现一个覆盖 flatMap

的 ListCountLogger case class

3) 然后把你的函数体改成这样,其中 countLogger returns monad:

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

然后您可以自由地为每个集合实现 CountLoggers,因此不会 "tied" 到列表。