scala - 可以使用 scalaz Arrow 组合吗?

标签 scala scalaz

我有两个功能。

  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]  

然而,可能有一种无意义的方式——当然,虽然不一定如此
  • liftFunction1W 上的一个方法它将函数提升到仿函数 M
  • 的领域
  • secondMAB 上的一个方法将函数应用到 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/

    相关文章:

    scala - 如何在 IDEA 中抑制特定的 scalastyle 规则?

    Scala:泛型的类型推断及其类型参数

    java - Scala 可迭代和 Java 可迭代

    scala - 在您的免费代数中进行流式传输的最佳方式是什么?

    Scalaz: `scalaz.syntax.applicative._` 如何发挥它的魔力

    scala - flatMap 与 ValidationNel 的析取

    java - Scala vs Java 性能(HashSet 和二元语法生成)

    scala - Kotlin 泛型继承

    scala - 如何使用申请功能申请

    scala - 如何在 Scala 中使用 >=>?