Kev*_*ght 7 design-patterns scala idioms scala-2.8 scala-collections
我会开始滚球.
给定一系列元素,其中一些元素可以被多次包含,一个典型的要求是计算它们 - 以计数或直方图的形式.
经常引用的解决方案是:
ss.groupBy(identity).mapValues(_.size)
Run Code Online (Sandbox Code Playgroud)
那么Scala中常见的类似问题还存在哪些其他解决方案?
使用Monoids 或Numerics 为丰富的类定义合理的操作,必要时使用隐式。
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}\nRun Code Online (Sandbox Code Playgroud)\n\n那么假设我有一个 的集合Money,我想对它们进行求和:
val turnover = trades.map(_.usdValue.abs).\xe2\x88\x91 //no implicit monoid :-(\nRun Code Online (Sandbox Code Playgroud)\n\n但为了做到这一点,我需要有一个隐式的Monoid. 但当然,只有当我已经拥有一些货币时,a 的零值Money才有意义!
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}\nRun Code Online (Sandbox Code Playgroud)\n\n所以现在 Scala 将使用这两个隐式:
\n\nimplicit val usd = Currency.USD\nval turnover = trades.map(_.usdValue.abs).\xe2\x88\x91 //yay for monoids :-)\nRun Code Online (Sandbox Code Playgroud)\n