加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用scalaz Arrow可组合?

发布时间:2020-12-16 08:54:43 所属栏目:安全 来源:网络整理
导读:我有两个功能. def process(date: DateTime,invoice: Invoice,user: User,reference: Reference) : (Action,Iterable[Billable]) def applyDiscount(billable: Billable) : Billable 如何组合这些以便我有一个功能(DateTime,Invoice,User,Reference)= (动作,
我有两个功能.

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

  def applyDiscount(billable: Billable) : Billable

如何组合这些以便我有一个功能(DateTime,Invoice,User,Reference)=> (动作,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(_))
  }

解决方法

你拥有的(简化)是:

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的领域
>第二个是MAB上的一个方法,它将函数应用于Bifunctor的右侧
>: – >是一个可用于Bifunctors的方法,表示在rhs上应用函数.

编辑 – missingfaktor似乎是正确的说f和然后g.lift [M].第二个工作:

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>

Pointfree:

scala> lazy val h = f andThen g.lift[List].second
h: A => (B,List[C]) = <lazy>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读