Метод сбора Scala Option не любит мою функцию PartialFunction - PullRequest
4 голосов
/ 03 марта 2011

Я думаю, что что-то упустил:

scala> Some(1) collect ({ case n if n > 0 => n + 1; case _ => 0})
res0: Option[Int] = Some(2)

scala> None collect ({ case n if n > 0 => n + 1; case _ => 0})   
<console>:6: error: value > is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})
                                 ^
<console>:6: error: value + is not a member of Nothing
       None collect ({ case n if n > 0 => n + 1; case _ => 0})

Почему происходит эта ошибка? Я думаю, что я неправильно понимаю, как collect работает ...

Ответы [ 2 ]

14 голосов
/ 03 марта 2011

Если не указано иное, литерал None имеет тип Option[Nothing].Это необходимо, так как None должен быть действительным членом всех типов Option [_].Если бы вместо этого вы написали

(None:Option[Int]) collect ({ case n if n > 0 => n + 1; case _ => 0}) 

или

val x:Option[Int] = None
x collect ({ case n if n > 0 => n + 1; case _ => 0}) 

, то компилятор сможет напечатать проверку вашего сбора вызовов

1 голос
/ 03 марта 2011
None collect ({ case n if n > 0 => n + 1; case _ => 0}) 

Почему бы n иметь метод >? Там нет ничего, что позволяло бы компилятору предполагать это. Итак, попробуйте изменить это на:

None collect ({ case n: Int if n > 0 => n + 1; case _ => 0})

И вы получите следующее сообщение об ошибке:

<console>:8: error: pattern type is incompatible with expected type;
 found   : Int
 required: Nothing
       None collect ({ case n: Int if n > 0 => n + 1; case _ => 0}) 
                               ^

Это означает, что компилятор знает, что Int здесь невозможен, поскольку вы просто передаете None. Как это бывает, None имеет тип Option[Nothing].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...