2017-01-05 2 views
0

Когда я запускаю следующий код, я получаю ошибку:Scala, Карринг по частичному параметру функции и неявного параметр

Error:(15, 25) missing parameter type for expanded function 
The argument types of an anonymous function must be fully known. (SLS 8.5) 
Expected type was: ? 
    testFuture onComplete({ 
        ^

код:

object TestFuture extends App{ 

val exe = ExecutionContext.fromExecutor(Executors.newCachedThreadPool()) 

testFuture onComplete({ 
case Success((str,i)) =>{ 
    println(str,i) 
} 
case Failure(e) =>{ 
    e.printStackTrace() 
}})(exe) 


println(Runtime.getRuntime.availableProcessors()) 
Thread.sleep(2000) 

def testFuture:Future[(String,Int)] = Future[(String,Int)] { 
    Thread.sleep(1000) 
    ("oh my sky",12) 
}(exe) 
} 

Когда я декорировать «VAL ех» с ' неявным "и вызывать функцию currying без явного использования 'exe', как следующий код, он идет правильно. Можешь мне сказать почему?

object TestFuture extends App{ 
implicit val exe = ExecutionContext.fromExecutor(Executors.newCachedThreadPool()) 

testFuture onComplete({ 
case Success((str,i)) =>{ 
    println(str,i) 
} 
case Failure(e) =>{ 
    e.printStackTrace() 
}}) 


println(Runtime.getRuntime.availableProcessors()) 
Thread.sleep(2000) 

def testFuture:Future[(String,Int)] = Future[(String,Int)] { 
    Thread.sleep(1000) 
    ("oh my sky",12) 
} 
} 

ответ

1

Я предполагаю, что метод invix-метода не поддерживает несколько списков аргументов. Попытайтесь использовать dot-notation:

testFuture.onComplete{ 
    case Success((str,i)) => 
    println(s"$str, $i") 
    case Failure(e) => 
    e.printStackTrace() 
}(exe) 
+0

Да, вы правы. Когда я изменяю свой код, как вы сказали, все идет правильно. Но не могли бы вы рассказать мне причину, не то ли «пространство» и «точка-нотация» в Scala? – muou0213

+0

Нет, существуют некоторые естественные ограничения для нотации infix. См. Https://www.scala-lang.org/files/archive/spec/2.11/06-expressions.html#function-applications, https://www.scala-lang.org/files/archive/spec/2.11 /06-expressions.html#infix-operations. 'Infix' не принимает аргументов. Это единое выражение, которое принято. (См. Также http://stackoverflow.com/questions/1181533/what-are-the-precise-rules-for-when-you-can-omit-parenthesis-dots-braces-f, и http: // docs.scala-lang.org/style/method-invocation.html) –

Смежные вопросы