【发布时间】:2020-06-23 11:27:15
【问题描述】:
我有数据类型:
import cats.Monoid
import cats.implicits._
object Domain {
case class Money(amount: Double) extends AnyVal {}
implicit val moneyMonoid = new Monoid[Money] {
override def combine(a: Money, b: Money): Money = Money(a.amount + b.amount)
override def empty: Money = Money(0)
}
case class Operation(account: Account, amount: Money) extends AnyRef
type Operations = List[Operation]
}
我想实现totalAmountCalculation之类的函数组合
val calcTotalAmount = map(x => x.amount) >>> combineAll
为此我写了一些代码:
def map[A, B](F: A => B): List[A] => List[B] = (m: List[A]) => m.map(F)
val combineAll = moneyMonoid.combineAll _
val calcTotalAmount = map[Operation, Money](x => x.amount) >>> combineAll
我可以使用哪些猫特性来避免编写 Monad 包装器以在函数组合中使用它?
我想看到我的代码:
map(x => x + 1) >>>
filter(x < 100) >>>
fold(1)((a,b) => a+b))
【问题讨论】:
-
我可以用来避免写 Monad 包装器 - 你的意思是
Monoid? -
我的意思是:对于
Monoid,我有一些方法,例如combine combineAll,对于 Monad,我有flatMap, map,对于可折叠的“foldLeft foldRight”。我怎样才能在作文中轻松使用咖喱? -
Monad 的组成方式与函数的组成方式不同。
-
灵感来自 ramda.js。
-
好用的东西
val filterOdd= filter(x => x %2); val sumOdd = filterOdd >> combineAll
标签: scala scala-cats