1

Я пытаюсь передать функцию как параметр, но эта функция имеет несколько аргументов (одна из которых является функцией).scala - Передача функции, которая принимает другую функцию как параметр

Вот что я пытаюсь сделать в базовом примере Python:

def first(string1, string2, func): 
    func(string1, string2, third) 

def second(string1, string2, func): 
    func(string1, string2) 

def third(string1, string): 
    # operations go here 

first("one", "two", second) 

Моя попытка это в Scala было следующее:

def first(string1: String, string2: String, func: (Any, Any, Any) => Unit) = { 
    func(string1, string2, func) 
} 
def second(string1: String, string2: String, func: (Any, Any) => Unit) = { 
    func(string1, string2) 
} 

def third(string1: String, string2: String) = { 
    // operations 
} 

def main(args: Array[String]): Unit = { 
    first("one", "two", second) 
} 

Я получаю ошибку за попытку передать second в first с недостаточным количеством аргументов. Возможно ли реализовать эту функциональность в том же стиле, что и пример Python?

EDIT:

Я попытался заменить тело моего основного метода с first("one", "two", second _), и это дает мне ошибку несоответствия типов

типа несоответствия; найдено: (String, String (Любой, любой, любой) => Unit) => требуется Единица измерения: (Любой, любой, любой) => Unit

Любая идея, что здесь происходит?

ответ

2

То, что вы пытаетесь сделать, не является безопасным для типа. Вы не можете назначить (String, String, (Any, Any) => Unit) => Unit на номер (Any, Any, Any) => Unit. Если бы вы могли, то вы можете сделать следующее:

val f = second _ 
val af: (Any, Any, Any) => Unit = f 
af(1, "abc", 5) 

Вы можете это сделать, если указать типы более точно:

def second(string1: String, string2: String, func: (String, String) => Unit) = { 
    func(string1, string2) 
} 

def third(string1: String, string2: String) = { 
    // operations 
} 

def first(string1: String, string2: String, func: (String, String, (String, String) => Unit) => Unit) = { 
    func(string1, string2, third) 
} 
+0

Так фактическая программа, которую я буду делать имеет 7 функций, которые принимают другая функция как параметр, все они вложены в стиль моего примера кода. Я предполагаю, что сохранение стиля Python не очень практично с Scala? – kevin

+0

@kevin - Да, прохождение вложенных обратных вызовов будет довольно уродливым. Если вы пытаетесь выполнить некоторые асинхронные операции, вы можете посмотреть фьючерсы. В противном случае для понимания и макросов можно использовать для выравнивания синтаксической структуры вашего кода. – Lee

+0

Я пошел дальше и принял ваш ответ, так как он решил мою проблему. Есть ли какой-нибудь пример, на который вы могли бы указать мне, чтобы использовать макросы? – kevin

Смежные вопросы