我有两个功能.
def process(date: DateTime, invoice: Invoice, user: User, reference: Reference) : (Action, Iterable[Billable])
def applyDiscount(billable: Billable) : Billable
Run Code Online (Sandbox Code Playgroud)
我如何编写这些以便我有一个函数(DateTime,Invoice,User,Reference)=>(Action,Iterable [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(_))
}
Run Code Online (Sandbox Code Playgroud)
你有什么(简化)是:
val f: A => (B, M[C]) //M is a Functor
val g: C => C
Run Code Online (Sandbox Code Playgroud)
我可以想到几种方法.我认为我的偏好是:
(a: A) => g.lift[M].second apply f(a)
Run Code Online (Sandbox Code Playgroud)
或者:
(a: A) => f(a) :-> g.lift[M]
Run Code Online (Sandbox Code Playgroud)
然而,可能有一种无点的方式 - 当然不一定如此
lift是一种Function1W将函数提升到函子M领域的方法second是一种MAB将函数应用于a 的右侧的方法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>
Run Code Online (Sandbox Code Playgroud)
Pointfree:
scala> lazy val h = f andThen g.lift[List].second
h: A => (B, List[C]) = <lazy>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
716 次 |
| 最近记录: |