Ответ 1
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
.