8

我有两个功能。

  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(_))
  }
4

1 回答 1

9

你所拥有的(简化)是:

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是一种在 aMAB的右侧应用函数的方法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>
于 2011-10-18T18:40:56.400 回答