8

私には2つの機能があります。

  def process(date: DateTime, invoice: Invoice, user: User, reference: Reference) : (Action, Iterable[Billable])

  def applyDiscount(billable: Billable) : Billable

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

ただし、無意味な方法がある可能性があります - もちろん、必ずしもそうとは限りませんが、

  • liftFunction1W関数をファンクター M の領域に持ち上げるメソッドです。
  • secondMABの右側に関数を適用するメソッドです。Bifunctor
  • :->Bifunctorsrhs での関数の適用を示すために使用できる方法です。

編集-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 に答える