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

scala – 根据布尔值调用Bifunctor的“side”上的函数

发布时间:2020-12-16 08:54:44 所属栏目:安全 来源:网络整理
导读:如果我有一个Bifunctor [A,A] bf的实例,则函数f:A = A和布尔值p: def calc[A,F[_,_]: Bifunctor](p: Boolean,bf: F[A,A],f: A = A): F[A,A] = { val BF = implicitly[Bifunctor[F]] BF.bimap(bf,(a : A) = if (p) f(a) else a,(a : A) = if (!p) f(a) else
如果我有一个Bifunctor [A,A] bf的实例,则函数f:A => A和布尔值p:

def calc[A,F[_,_]: Bifunctor](p: Boolean,bf: F[A,A],f: A => A): F[A,A] = {
  val BF = implicitly[Bifunctor[F]]
  BF.bimap(bf,(a : A) => if (p) f(a) else a,(a : A) => if (!p) f(a) else a)
}

我怎样才能更简洁(更具说服力)?基本上我试图在依赖于某个谓词的bifunctor(例如Tuple2)的一侧调用一个函数.如果谓词为真,我想映射LHS和RHS,如果它是假的

val t2 = (1,2)
def add4 = (_ : Int) + 4
calc(true,t2,add4) //should be (5,2)
calc(false,add4) //should be (1,6)

鉴于我想使用元组(而不是更通用的Bifunctor),我似乎能够使用arrows,如下所示:

def calc[A](p: Boolean,bf: (A,A),f: A => A): (A,A) 
  = (if (p) f.first[A] else f.second[A]) apply bf

解决方法

并不是那么好:

def calc[A,_]:Bifunctor](p: Boolean,A] =
   (if (p) (bf :-> (_: A => A)) else ((_:A => A) <-: bf))(f)

好一点:

def cond[A:Zero](b: Boolean,a: A) = if (b) a else mzero

def calc[A,f: Endo[A]): F[A,A] =
  cond(p,f) <-: bf :-> cond(!p,f)

一些Haskell,只是为了语言羡慕:

calc p = if p then first else second

(编辑:李大同)

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

    推荐文章
      热点阅读