【发布时间】:2011-06-09 15:27:00
【问题描述】:
当我想切换函数和对象时,我可以使用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
为什么编译器不理解这个?从String 到特征SeqLike 中的某些类混合肯定存在隐式转换。
【问题讨论】:
-
棘手。一开始我以为是因为一次只能隐含一个,但现在看来这可能也是隐藏在某个地方的方差问题……
-
@Debilski,我不确定
|>在 scalaz 中的定义位置,但是当我尝试定义自己的时,我认为“只有一个隐式规则”阻止了它的应用: "aoeu" 需要使用|>方法隐式转换为类,然后再转换为SeqLike。 -
显示错误信息。不是每个人都有现成的 Scalaz,但错误消息通常会说明问题所在。