Я довольно новичок в Scala и функциональном программировании в целом, поэтому у меня есть немного проблем, обертывающих мою голову вокруг концепции частично прикладных функций и функций currying. Есть также довольно высокий шанс, что я собираюсь перепутать какую-то терминологию, поэтому все исправления приветствуются.Scala - частично и частично прикладные функции
Примечание: Я использую платформу Scala Play, но это скорее проблема Scala, чем проблема с Play.
Учитывая функцию как этот
def create(id: Long, userId: Long, label: String)
Я получаю userId
и label
как (Int, String)
кортеж и id
как Long
. В основном то, что я пытаюсь сделать, это передать id и кортеж функции одновременно.
Теперь, я прочитал, что прохождение кортежа функции можно сделать что-то вроде этого
scala> def f(a: Int, b: String) = 0
f: (a: Int, b: String)Int
scala> (f _).tupled((2, "Hello"))
res0: Int = 0
и что также можно частично применить функцию, как это
scala> def f(a: Int, b: String) = 0
f: (a: Int, b: String)Int
scala> val ff = f(_: Int, "Hello")
ff: Int => Int = <function1>
scala> ff(2)
res1: Int = 0
Поэтому моя первоначальная идея состояла в том, чтобы объединить эти две концепции примерно так:
это приводит к ошибке
<console>:10: error: _ must follow method; cannot follow h.type
(h _).tupled((1, "Hello"))
^
Так что мой вопрос в первую очередь, почему это не работает, потому что для меня это имеет смысл. И во-вторых, как бы я мог добиться этого?
Благодарим за помощь!
Спасибо, это работает! Похоже, мне еще многое предстоит узнать о Scala. – gry
Добро пожаловать! В Scala всегда есть чему поучиться :) – dk14