Próbuję napisać metodę, która może podjąć funkcję typu (String) => Jednostka. To nie działa.

  val sayHelloToPerson : (String) => Unit = (s : String) => { println("Hello  " + s) }

To działa, jeśli zadzwonię

sayHelloToPerson("Mark")

Ale jeśli nazwałbym to z metody jak poniżej

  def executeAnyFunction (f: (String) => Unit) = {
    f()
  }


  executeAnyFunction(sayHelloToPerson("Mark"))

Kompilator mówi,

type mismatch, expected: String => Unit, actual: Unit. 

Czy funkcja nie jest funkcją typu (String) => Unit?

2
Srinivas 19 luty 2018, 11:40

3 odpowiedzi

Najlepsza odpowiedź

Robiąc to podczas definiowania egzekucjonowania, wywołujesz funkcję F, bez żadnego parametru, stąd awaria kompilatora.

Co powinno zrobić, to zwrot f, ale bez dzwonienia do niego (bez nawiasów):

def executeAnyFunction (f: (String) => Unit) = {
        f
}

Następnie możesz użyć nowej funkcji w następujący sposób

  executeAnyFunction(sayHelloToPerson)("Mark")

Gdzie executeAnyFunction(sayHelloToPerson) jest taki sam jak f i dajesz mu parametr ("Mark")

Szybki przykład tutaj:

enter image description here

1
SCouto 19 luty 2018, 08:53

Ponieważ nazywasz drugą metodę za pomocą funkcji.

Spróbuj executeAnyFunction(sayHelloToPerson)

I zmień korpus, aby przejść do parametru String do f. na przykład

def executeAnyFunction (f: (String) => Unit) = {
  f("Mark")
}


executeAnyFunction(sayHelloToPerson)
0
Evgeny 19 luty 2018, 08:47

Być może miałeś na myśli:

def executeAnyFunction(f: (String) => Unit)(s: String) = f(s)

executeAnyFunction(sayHelloToPerson)("Mark")
// prints "Hello  Mark"

To definiuje executeAnyFunction jako funkcję z dwoma listami parametrów: jedna z funkcją do wykonania, a inne z wejściem dla tej funkcji.

Nadal nie jestem pewien, jak executeAnyFunction ma dowolną wartość inną niż edukacyjna.

0
Tzach Zohar 19 luty 2018, 09:11