2013-11-25 3 views

ответ

2

В case f :() => Unit => частях, case заявления ломает тип от действия в первой плоской стрелке (=>) он видит.

a match { case f : MyType => } 
//      ^

Таким образом, в последнем примере он ломает заявление следующим образом,

a match { case f :() => Unit => } 
//     ^

И пытается сопоставить с типом () вместо () => Unit, который не является типом.

+0

Спасибо за ответ Может ли это помочь каким-то образом (без объявления явного типа), с, например, дополнительные скобки я попробовал пару вариантов, но ничего не получалось –

+1

Try 'Function0. [Unit] '. Фактически'() => A' является синтаксическим suger для 'Function0 [A]' – tiran

1

Поскольку у вас есть два экземпляра «=>», вам нужна скобка анонимного типа функции:

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 
Смежные вопросы