Короче - я не понимаю, почему это компилируется:Соответствующие типы функций?
var a : Any = null
type MyType =() => Unit
a match { case f : MyType => }
в то время как это не
var a : Any = null
a match { case f :() => Unit => }
Короче - я не понимаю, почему это компилируется:Соответствующие типы функций?
var a : Any = null
type MyType =() => Unit
a match { case f : MyType => }
в то время как это не
var a : Any = null
a match { case f :() => Unit => }
В case f :() => Unit =>
частях, case
заявления ломает тип от действия в первой плоской стрелке (=>
) он видит.
a match { case f : MyType => }
// ^
Таким образом, в последнем примере он ломает заявление следующим образом,
a match { case f :() => Unit => }
// ^
И пытается сопоставить с типом ()
вместо () => Unit
, который не является типом.
Поскольку у вас есть два экземпляра «=>», вам нужна скобка анонимного типа функции:
null match {
case f: (() => Unit) => println("yep")
case _ => println("nope") // prints nope
var i = 1
// input is a function with no args, returning Unit (not invoked)
{() => {i = i + 1; print("outer i=" + i + " ")} } match {
case f : (() => Unit) => println("yep") // prints yep
case _ => print("nope")
}
Можно также сделать это с помощью метода:
// input is a function with no args, returning Unit (not invoked)
def myProc(a:() => Unit) = a match {
case f: (() => Unit) => println("yep")
case _ => println("nope")
}
var i = 1
myProc({() => {i = i + 1; print("outer i=" + i + " ")} }) // prints yep
параметра а функция. Результат функции не определяется перед вызовом - вместо этого выражение, которое определяет функцию, вычисляется перед вызовом. Тогда результат функции вычисляется каждый раз, когда параметр вычисляется (вызывается) в методе (т.е. 0 раз, так как он используется только в матче шаблона, никогда не вызывается, как a()
)
// here, a is invoked 3 times
def myProc(a:() => Unit) = for (j <- 1 to 3) a()
var i = 1
myProc({() => {i = i + 1; print("outer i=" + i + " ")} })
// prints outer i=2 outer i=3 outer i=4
Аналогичные (но не идентичен) вещь может быть выполнена с помощью не функциональных аргументов (т.е. выражений/значений). Вместо объявления a: SomeType
(параметр pass-by-value, где выражение оценивается до вызова), можно использовать a: => SomeType
(параметр pass-by-name, где выражение не оценивается до вызова, но оценивается каждый раз аргумент ссылается в методе:.?
// input is a pass-by-name Unit expression
def myProc(a: => Unit) = a match {
case f: Unit => println("yep")
}
var i = 1
myProc({i = i + 1; print("outer i=" + i + " ")}) // prints yep
// input is a pass-by-name Unit expression
def myProc(a: => Unit) = {
for (j <- 1 to 3) yield a
a
}
var i = 1
myProc({i = i + 1; print("outer i=" + i + " ")})
// prints outer i=2 outer i=3 outer i=4 outer i=5
Спасибо за ответ Может ли это помочь каким-то образом (без объявления явного типа), с, например, дополнительные скобки я попробовал пару вариантов, но ничего не получалось –
Try 'Function0. [Unit] '. Фактически'() => A' является синтаксическим suger для 'Function0 [A]' – tiran