Проблема с функцией Scala и функцией вызова по имени - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь l oop вторым параметром (exp) в этой функции, которая использует параметры вызова по имени. Первые 3 параметра - это индекс, логическое значение для остановки l oop и функция приращения. Я получаю результат с 10 '(), когда я пытаюсь l oop "привет, мир" 10 раз, как видно в тестовом коде. Могу я получить помощь с тем, что здесь не так? Спасибо

def forLoop(ival: => Int, f: (Int) => Boolean, g: (Int)=>Int)(exp: => Unit): Unit = {
  if(f(ival)==false) 
    return
  else {
    println(exp)
    forLoop(g(ival),f,g)(exp)
  }
}

def f(x: Int): Boolean = { x<10 }
def g(y: Int): Int = { y+1 }
val exp: Unit = "Hello World"
forLoop(0,f,g)("Hello World")

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Думаю, это соответствует вашим требованиям.

def forLoop(ival: => Int, f: =>Int => Boolean, g: =>Int=>Int
           )(exp: => Unit): Unit =
  if (f(ival)) {
    exp
    forLoop(g(ival),f,g)(exp)
  }

def f(x: Int): Boolean = x<10
def g(y: Int): Int = y+1
def exp: Unit = println("Hello World")
forLoop(0,f,g)(exp)
2 голосов
/ 29 мая 2020

Значение "Hello World" относится к типу String, однако вы назначаете его Unit

val exp: Unit = "Hello World"

, компилятор расширяется до

val exp: Unit = {
  "Hello World";
  ()
}

Обратите внимание, как () становится значением exp. Попробуйте изменить определение exp на

val exp: String = "Hello World"

и второй список параметров на

(exp: => String)

Если вы компилируете с флагом компилятора -Wvalue-discard, например,

scala -Wvalue-discard -e 'val exp: Unit = "Hello World"'

вы получите предупреждение

warning: discarded non-Unit value
val exp: Unit = "Hello World"
                ^
...