Применение частичных функций там, где они определены, и другой функции, где нет
Это мотивационный пример, учитывая:
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