Передайте термин поиска и оператор в Scala Polymorphic Function
У меня есть эта полиморфная функция:
def findFirst[A](as: Array[A], p: A => Boolean): Int = {
@annotation.tailrec
def loop(n: Int): Int = {
if(n >= as.length) -1
else if(p(as(n))) n
else loop(n + 1)
}
loop(0)
}
Из функционального программирования в Scala и я хочу передать оператор <Это равно конкретному значению>. Как бы я это сделал? В настоящее время у меня есть это:
println(findFirst(Array("abc", "def", "ghi"), == "def"))
Здесь оператор < == "def">. Scala это не нравится, но я не могу найти способ передать это значение, пару операторов. Что-то подсказывает мне, что здесь можно использовать карри?
2 ответа
Полный синтаксис для указания этой функции:
(x: String) => x == "def"
Так что вы можете сделать:
println(findFirst(Array("abc", "def", "ghi"), (x: String) => x == "def"))
Однако, если вы измените findFirst
Определение должно быть двумя отдельными списками параметров:
def findFirst[A](as: Array[A])(p: A => Boolean): Int = {
...
}
Затем Scala может посмотреть на первый параметр (массив), увидеть, что A
должно быть String
и сделать вывод, что тип второго параметра должен быть String => Boolean
, так что вы можете опустить аннотацию типа:
println(findFirst(Array("abc", "def", "ghi"))(x => x == "def"))
Или еще лучше:
println(findFirst(Array("abc", "def", "ghi"))(_ == "def"))
Вам просто нужно подчеркнуть:
println(findFirst(Array("abc", "def", "ghi"), _== "def"))