在Scala中已经建立了常见问题的常见模式/解决方案

Kev*_*ght 7 design-patterns scala idioms scala-2.8 scala-collections

我会开始滚球.

给定一系列元素,其中一些元素可以被多次包含,一个典型的要求是计算它们 - 以计数或直方图的形式.

经常引用的解决方案是:

ss.groupBy(identity).mapValues(_.size)
Run Code Online (Sandbox Code Playgroud)

那么Scala中常见的类似问题还存在哪些其他解决方案?

oxb*_*kes 3

使用Monoids 或Numerics 为丰富的类定义合理的操作,必要时使用隐式。

\n\n
case class Money(ccy: Currency, amount : BigDecimal) {\n  def +(that : Money) = { \n    require(this.currency == that.curency)\n    copy(amount = this.amount + that.amount)\n  }\n  def abs = copy(amount = amount.abs)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么假设我有一个 的集合Money,我想对它们进行求和:

\n\n
val turnover = trades.map(_.usdValue.abs).\xe2\x88\x91 //no implicit monoid :-(\n
Run Code Online (Sandbox Code Playgroud)\n\n

但为了做到这一点,我需要有一个隐式的Monoid. 但当然,只有当我已经拥有一些货币时,a 的Money才有意义!

\n\n
implicit def CurrencyMonoid(implicit currency : Currency) = new Monoid[Currency] {\n  def zero = Money(currency, 0)\n  def append(m1 : Money, m2 : Money) = m1 + m2\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以现在 Scala 将使用这两个隐式:

\n\n
implicit val usd = Currency.USD\nval turnover = trades.map(_.usdValue.abs).\xe2\x88\x91 //yay for monoids :-)\n
Run Code Online (Sandbox Code Playgroud)\n