Передайте термин поиска и оператор в 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"))
Другие вопросы по тегам