Проблема с функцией Scala и вызовом по имени

Я пытаюсь зациклить второй параметр (exp) в этой функции, которая использует параметры вызова по имени. Первые 3 параметра — это индекс, логическое значение для остановки цикла и функция приращения. Я получаю вывод с 10 '(), когда пытаюсь зациклить "hello world" 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")

person gradstud    schedule 29.05.2020    source источник
comment
Также я думаю, что отформатировал функции параметров f и g при попытке использовать вызов по имени, но я не уверен.   -  person gradstud    schedule 29.05.2020
comment
Я изменил его, чтобы вернуть Unit, и изменил return true, чтобы просто вернуться в базовом случае. Виноват. Извините, я новичок   -  person gradstud    schedule 29.05.2020
comment
хорошо, я обновил   -  person gradstud    schedule 29.05.2020


Ответы (2)


Значение "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"
                ^
person Mario Galic    schedule 29.05.2020
comment
Я получаю тот же результат, даже когда объявляю val exp: String = Hello World - person gradstud; 29.05.2020
comment
О, мне нужно, чтобы второй параметр был единицей - person gradstud; 29.05.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)
person jwvh    schedule 29.05.2020