2012-05-08 3 views
3

я следующее:Scala: где поставить @unchecked аннотации в Еогеаспе

samples.sliding(2).foreach{case List(a, b)=> printf("%x %x\n", a.value, b.value)} 

Я знаю, что единственное «дело» будет соответствовать всем возможным значениям, но я получаю «матч не является исчерпывающим 'предупреждение. Книга Scala объясняет, где поставить аннотацию @unchecked на нормальное полностью заданное выражение соответствия, но не для формы выше. Как я могу аннотировать выше, чтобы остановить компилятор от жалобы?

ответ

10

@unchecked является только определен для селектора в операции сравнения, а не для произвольных функций. Таким образом, вы могли бы

foreach{ x => (x: @unchecked) => x match { case List(a,b) => ... } } 

но это довольно полный рот.

В качестве альтернативы, вы можете создать метод, который ненадежно преобразует частичную функцию полного одного (который на самом деле просто бросает к функции суперкласса PartialFunction):

def checkless[A,B](pf: PartialFunction[A,B]): A => B = pf: A => B 

, а затем вы можете

samples.sliding(2).foreach(checkless{ 
    case List(a,b) => printf("%x %x\n", a.value, b.value) 
}) 

, и у вас нет никаких предупреждений, потому что он ожидал частичной функции.

+0

Я получил там сразу после того, как вы отправили сообщение, спасибо в любом случае - хотя я надеялся на некоторые реплики для ответа на мой собственный вопрос ;-) Преобразование PF в CF сложно, потому что нет явного приведения, хотя я вижу, что это такое. Спасибо, как за ответ, так и за безответственный метод. –

-2

Почему бы вам не добавить фиктивный футляр, если вы уверены, что этого не произойдет?

samples.sliding (2).foreach { 
    case List (a, b) => printf ("%x %x\n", a.value, b.value) 
    case _   => sys.error ("impossible") 
} 
+1

Потому что я знаю, что уловка никогда не будет взята, и поэтому это не нужно. Я мог бы сделать это с отдельными def и аннотировать, что, как описано на p288 в книге ProgInScala, но я пытаюсь понять, как комментировать анде, как я сказал в вопросе. –

0

Никакая идея о @unchecked, но почему бы просто не назвать x.head и x.tail.head или x(0) и x(1)?

+0

Да, это сработает, но мне скорее нравится оператор матча Scala :-) –

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