scala> "aoeu" |> length2
<console>:14: error: type mismatch;
found : (scala.collection.SeqLike[_, _]) => Int
required: (java.lang.String) => ?
"aoeu" |> length2
Сообщение об ошибке довольно ясно.
Хотя существует неявное преобразование из String
в SeqLike[_,_]
, преобразование из (SeqLike[_, _]) => Int
в 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
в X
.