2016-07-22 2 views
2

Следующий код работает:Может ли стандартный оператор загружаться или перевозиться?

val ls = Seq("a", "b", "b", "c") 

def strEq(a: String, b: String) = a == b 
val detectChange = (ls zip ls.tail).map((strEq _). tupled) 

Можно ли использовать стандартный оператор непосредственно вместо создания strEq, что-то вдоль линий?

val detectChange = (ls zip ls.tail).map(== _. tupled) 
+0

Ваш код не компилируется на Скале 2.11.8: ' ') «ожидается, но». найденный. [error] val detectChange = (ls zip ls.tail) .map (strEq _. Tupled) '. –

+1

Вам нужно удалить '.' после' strEq' для компиляции. –

+0

Ближайшая вещь, которую я вижу (которая немного более подробно), которая встроена, это '(ls zip ls.tail) .map {case (x, y) => x == y}' –

ответ

4

Для частного случая 2-кортежа, вы можете использовать:

scala> val ls = Seq("a", "b", "b", "c") 
ls: Seq[String] = List(a, b, b, c) 

scala> (ls, ls.tail).zipped.map(_ == _) 
res0: Seq[Boolean] = List(false, true, false) 

Другие варианты

scala> (ls zip ls.tail).map{case (a,b) => a == b} 
res2: Seq[Boolean] = List(false, true, false) 

scala> (ls zip ls.tail).map{((_: String) == (_: String)).tupled} 
res5: Seq[Boolean] = List(false, true, false) 

scala> (ls zip ls.tail).map(((_ == _): ((String, String) => Boolean)).tupled) 
res0: Seq[Boolean] = List(false, true, false) 

но они не легче понять и проще писать. Механизм вывода типов Scalas недостаточно эффективен, чтобы вывести правильный тип в последнем случае, поэтому, если типы параметров не совпадают, вам часто приходится отступать, чтобы использовать сопоставление шаблонов.

+0

Я думаю '((_: String) == (_: String)). Tupled' отвечает на мой вопрос в заголовке« как закодировать стандартный оператор »- он показывает, как получить функцию, соответствующую оператору. Это более подробно, чем я надеялся, но это показывает, что это можно сделать. – Suma

1

проблема, о которой я думаю, вы столкнулись с тем, что == не является стандартным оператором в традиционном смысле, это метод. он не существует как Function2, поэтому нет места, чтобы позвонить ему с .tupled, который даст то, что вы ищете. ((_: String) == (_: String)).tupled работает, потому что он is a Function2.

не уверен, что если выше проблема является примером или то, что вам действительно нужно сделать, но и для удовольствия, это также работает:

ls sliding 2 map (_.toSet.size == 1)