我有两个功能。
def process(date: DateTime, invoice: Invoice, user: User, reference: Reference) : (Action, Iterable[Billable])
def applyDiscount(billable: Billable) : Billable
我怎样才能组合这些,以便我有一个单一的功能(日期时间,发票,用户,引用)=>(操作,可迭代[计费])
这是我想要的穷人的方式
def buildFromInvoice(user: User, order: Invoice, placementDate: DateTime, reference: Reference) = {
val ab = billableBuilder.fromInvoice(user, order, placementDate, reference)
(ab._1, ab._2.map(applyDiscount(_))
}
最佳答案
你所拥有的(简化)是:
val f: A => (B, M[C]) //M is a Functor
val g: C => C
我可以想到几种方法来做到这一点。我认为我的偏好是:
(a: A) => g.lift[M].second apply f(a)
或者也:
(a: A) => f(a) :-> g.lift[M]
然而,可能有一种无意义的方式——当然,虽然不一定如此
lift
是 Function1W
上的一个方法它将函数提升到仿函数 M second
是 MAB
上的一个方法将函数应用到 Bifunctor
的右侧:->
是 Bifunctors
可用的方法表示函数在 rhs 上的应用。 编辑 - missingfaktor 说
f andThen g.lift[M].second
似乎是正确的作品:scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> case class A(); case class B(); case class C()
defined class A
defined class B
defined class C
scala> lazy val f: A => (B, List[C]) = sys.error("")
f: A => (B, List[C]) = <lazy>
scala> lazy val g: C => C = sys.error("")
g: C => C = <lazy>
无点:
scala> lazy val h = f andThen g.lift[List].second
h: A => (B, List[C]) = <lazy>
关于scala - 可以使用 scalaz Arrow 组合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811281/