Применение частичных функций там, где они определены, и другой функции, где нет

Это мотивационный пример, учитывая:

List((1,2), (2,1), (3,1))

Я хотел бы вернуться:

List((1,2),(3,1))

Я пытался сделать это несколькими способами. Первый:

List((1,2), (2,1), (3,1)) map { case (a,b) => if (a > b) (a,b) else (b,a) } 
distinct

Затем я попытался использовать кортеж:

List((1,2), (3,4), (2,1)) map { t => if (t._1 <= t._2) t else t.swap }

затем определение частичной функции немного по-другому:

val pf: PartialFunction[(Int,Int), (Int,Int)] = {
  case (i, j) if i >= j => (j, i)
}

List((1,2), (3,4), (2,1)) map pf distinct

Есть ли способ применить PartialFunction только к элементам, которые определены для? или соединение ПФ с идентичностью в некоторых, как.

1 ответ

Решение

Вот еще одна форма для полноты картины

List((1,2), (2,1), (3,1)) map { case x@(i,j) => if (i >= j) (j,i) else x } distinct

Который в основном такой же, как некоторые другие ваши формы.

Есть ли способ применить PartialFunction только к элементам, которые определены для? или соединение ПФ с идентичностью в некоторых, как.

Да. applyOrElse.

В этом случае очень мало причин проверять, где ваша частичная функция и не определена, потому что объем работы, необходимый для проверки определенности, будет таким же, как и работа, которую должна выполнить функция total, прежде чем выяснить, что делать (т.е. сравнение двух элементов).

Но если вы действительно хотите

List((1,2), (3,4), (2,1)) map {x => pf.applyOrElse(x, identity[(Int, Int)])} distinct
Другие вопросы по тегам