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

切换功能和对象与scalaz’|>

发布时间:2020-12-16 09:18:08 所属栏目:安全 来源:网络整理
导读:我可以使用 scalaz |运算符当我想切换功能和对象时,可以获得更多的可读性.让我来介绍一个模型函数: def length2(x:String) = x.length * 2 ?现在,我可以用两种方式写: "aoeu" | length2length2("aoeu") 但是,如果我将此函数定义为更通用,则会停止工作. def
我可以使用 scalaz |>运算符当我想切换功能和对象时,可以获得更多的可读性.让我来介绍一个模型函数:

def length2(x:String) = x.length * 2

?现在,我可以用两种方式写:

"aoeu" |> length2
length2("aoeu")

但是,如果我将此函数定义为更通用,则会停止工作.

def length2(x:SeqLike[_,_]) = x.length * 2
length2("aoeu") // ok
"aoeu" |> length2 // doesn't work__

为什么编译器不明白这个?绝对有一个隐含的转换从字符串到某些类混合特征SeqLike.

解决方法

scala> "aoeu" |> length2
<console>:14: error: type mismatch;
 found   : (scala.collection.SeqLike[_,_]) => Int
 required: (java.lang.String) => ?
       "aoeu" |> length2

错误信息很清楚.

虽然存在从String到SeqLike [_,_]的隐式转换,但没有从(SeqLike [_,_])=> Int to String => ?.

这可以使用以下隐式转换来修复:

implicit def liftFun[X,T <% X,U](f: (X) => U): (T) => U = {
  def g(t:T) = f(t)
  g _
}

编辑2:这是一个非标量运算符.

class Pipe[T](t:T) {
  def |%>[X,U](f: (X) => U)(implicit ev: T <%< X) = f(t)
}
implicit def toPipe[T](t:T) = new Pipe(t:T)

那么你可以这样使用它:

def l1(a:String) = a.length
def l2(a:Seq[_]) = a.length * 2

"abc" |%> l1
"abc" |%> l2

它允许|%>只要存在从T到X的隐式转换的证据,就采取一个不直接在T上工作的功能.

(编辑:李大同)

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

    推荐文章
      热点阅读