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

scala – if(p(f(a),f(b)))的功能等价物a else b

发布时间:2020-12-16 09:21:09 所属栏目:安全 来源:网络整理
导读:我猜想必须有更好的功能表达方式: def foo(i: Any) : Intif (foo(a) foo(b)) a else b 所以在这个例子中f == foo和p == _ _.在这里,必须有一些高超的聪明才智!我可以看到使用BooleanW我可以写: p(f(a),f(b)).option(a).getOrElse(b) 但是我确信我可以编写
我猜想必须有更好的功能表达方式:

def foo(i: Any) : Int

if (foo(a) < foo(b)) a else b

所以在这个例子中f == foo和p == _< _.在这里,必须有一些高超的聪明才智!我可以看到使用BooleanW我可以写:

p(f(a),f(b)).option(a).getOrElse(b)

但是我确信我可以编写一些只提及a和b一次的代码.如果存在这个问题,它必须在Function1W的某些组合上,而另外一些则是scalaz对我来说有点神秘!

编辑:我想我在这里问的不是“我该怎么写?”但是“这样一个功能的正确名称和签名是什么,并且与FP类似的东西有什么关系,我还不了解,像Kleisli,Comonad等?

解决方法

以防万一不在Scalaz:

def x[T,R](f : T => R)(p : (R,R) => Boolean)(x : T*) =
  x reduceLeft ((l,r) => if(p(f(l),f(r))) r else l)

scala> x(Math.pow(_ : Int,2))(_ < _)(-2,1)
res0: Int = -2

一些开销的替代方案,但更好的语法.

class MappedExpression[T,R](i : (T,T),m : (R,R)) {
  def select(p : (R,R) => Boolean ) = if(p(m._1,m._2)) i._1 else i._2 
}

class Expression[T](i : (T,T)){
  def map[R](f: T => R) = new MappedExpression(i,(f(i._1),f(i._2)))
}

implicit def tupleTo[T](i : (T,T)) = new Expression(i)

scala> ("a","bc") map (_.length) select (_ < _)
res0: java.lang.String = a

(编辑:李大同)

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

    推荐文章
      热点阅读