如何结合Functor进行运算?
How to combine operation with Functor?
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" 到列表。
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 class3) 然后把你的函数体改成这样,其中 countLogger returns monad:
def getNames( users: List[User]) {
countLogger( users ).flatMap( _.name )
}
然后您可以自由地为每个集合实现 CountLoggers,因此不会 "tied" 到列表。