Scala 如何将运算与函子结合起来?

Scala 如何将运算与函子结合起来?,scala,functional-programming,Scala,Functional Programming,我在看 我将一个日志添加到用户计数中,这很糟糕,因为它将我绑定到列表 def getNames(users: List[User]) { logger.info(users.count) // OMG tied up to List. users.map(_.name) } 但这将我与列表联系在一起 def getNames(users: List[User]) { logger.info(users.count) // OMG tied up to List. users.m

我在看

我将一个日志添加到
用户
计数中,这很糟糕,因为它将我绑定到
列表

def getNames(users: List[User]) {
  logger.info(users.count) // OMG tied up to List.
  users.map(_.name)
}
但这将我与
列表联系在一起

def getNames(users: List[User]) {
  logger.info(users.count) // OMG tied up to List.
  users.map(_.name)
}
所以我使用了一个
函子

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

因此,我理解了可组合性的重要性,并且没有向不属于的函数添加功能,现在我不理解的是,我想添加
日志记录
功能和其他功能(我们显然需要这些功能…)我如何以适当的组合方式做到这一点?

我想我会遵循您的要求(但不确定)。因此,为了实现该代码的可组合版本,我将执行以下操作。但是,请注意,对于本例来说,它可能是过度的,但为了简单地表达这个概念,我认为它是合适的

1我将定义一个记录器monad trait,其map/flatMap执行日志记录

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

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

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

然后,您就可以自由地为每个集合实现CountLogger,因此不会“绑定”到列表

标准库不提供
Functor
类型类,因此最好指出您的类来自何处。老实说,我认为在这种情况下增加抽象并没有多大价值。我不确定你在寻找什么。实际上,您可以在广义函子方法中登录。但由于现在有了函子,所以不能期望使用特定于列表的操作,比如count。函子没有一个概念size@pagoda_5b正如你所说,我已经用
函子
抽象出了列表属性,那么我的问题是什么是正确的(使用视频中推荐的可组合性)
log
list.size
?Scalaz中有一个
可折叠的
类型类,它提供了
长度
,如果您同时需要它和
Functor
,您可以完成您想要的(但在这种情况下可能不值得)。@Jas您可能想用适当的“抽象”和计数方面与另一个方面相结合,以便将它们分开。在任何情况下,我们都不能假设每个方面都可以“抽象”“作为一个函子,每个行为都有一个适当的一般结构,范畴理论试图对其进行分类,确定其定义属性。我不确定这个答案是否有意义,而且在任何情况下,它似乎与OP所寻找的相差甚远。也许你可以想出一个模糊合理的方法来讨论monad,在其中你覆盖了特定类型构造函数的子类中的
flatMap
,但这根本不是标准的,也不符合问题中的
Functor
的显式表示。