質問

2つの機能があります。

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

  def applyDiscount(billable: Billable) : Billable

(DateTime、Invoice、User、Reference)=>(アクション、反復[請求可能])の単一の関数があるように、これらを作成するにはどうすればよいですか?

これが私が欲しいものの貧しい男の道です

  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]  

ただし、おそらくaがあります ポイントフリー 方法 - 必ずしもそうではありませんが、もちろん

  • 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>

ポイントフリー:

scala> lazy val h = f andThen g.lift[List].second
h: A => (B, List[C]) = <lazy>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top