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;显然我们确实需要这些功能...)我该如何以正确的可组合方式做到这一点?
答案 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“绑定”。