A和一个 Boolean值(value) p : def calc[A, F[_,_]: Bifunctor](p:-6ren">
gpt4 book ai didi

scala - 根据 bool 值在 Bifunctor 的 "side"上调用函数

转载 作者:行者123 更新时间:2023-12-04 08:38:26 25 4
gpt4 key购买 nike

如果我有一个 Bifunctor[A,A] 的实例bf,一个函数 f : A => A和一个 Boolean值(value) 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)
}

我怎样才能更简洁(和表达地)表达这个?基本上,我试图在依赖于某些谓词的双仿函数(例如 Tuple2 )一侧调用一个函数。如果谓词为真,如果为假,我想映射 LHS 和 RHS
val t2 = (1, 2)
def add4 = (_ : Int) + 4
calc(true, t2, add4) //should be (5,2)
calc(false, t2, 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, F[_,_]:Bifunctor](p: Boolean, bf: F[A, A], f: A => A): F[A, 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[_,_]:Bifunctor](p: Boolean, bf: F[A, A], f: Endo[A]): F[A, A] =
cond(p, f) <-: bf :-> cond(!p, f)

一些 Haskell,只是为了语言羡慕:
calc p = if p then first else second

关于scala - 根据 bool 值在 Bifunctor 的 "side"上调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4156262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com