Почему механизм вывода типов в Scala не может решить эту проблему? - PullRequest
2 голосов
/ 21 мая 2010

В приведенном ниже фрагменте кода - почему я должен дать аннотацию типа для Nil?

Welcome to Scala version 2.8.0.RC2 (OpenJDK Server VM, Java 1.6.0_18).
Type in expressions to have them evaluated.
Type :help for more information.

scala> List(Some(1), Some(2), Some(3), None).foldLeft(Nil)((lst, o) => o match { case Some(i) => i::lst; case None => lst })          
<console>:6: error: type mismatch;
found   : List[Int]
required: object Nil
   List(Some(1), Some(2), Some(3), None).foldLeft(Nil)((lst, o) => o match { case Some(i) => i::lst; case None => lst })
                                                                                              ^

scala> List(Some(1), Some(2), Some(3), None).foldLeft(Nil:List[Int])((lst, o) => o match { case Some(i) => i::lst; case None => lst })
res1: List[Int] = List(3, 2, 1)

Ответы [ 2 ]

3 голосов
/ 21 мая 2010

Проблема в том, что Nil - это объект, который расширяет List. Это означает, что Nil.type является подклассом List и, следовательно, тип для аккумулятора foldLeft будет Nil.type.

Это единственное место, где бы я хотел, чтобы Scala попробовал немного (или много, чего бы это ни стоило :) труднее получить лучший вывод типа.

0 голосов
/ 21 мая 2010

Вы можете избежать неприятностей, сделав это так

private def removeNone[A](xs:List[Option[A]]) = {
    xs.filter(_.isInstanceOf[Some[_]]).map(_ match {
        case Some(t) => t
        case _ => ().asInstanceOf[A] //can't happen, needed to avoid warning
    })
}

Хотя это может и не дать прямого ответа на ваш вопрос, я написал эту функцию пару часов назад и подумал, что не помешает поделиться ею. Вы можете пропустить второй случай, если не возражаете получить предупреждение.

Я также считаю, что комбинацию карты и фильтра легче читать, чем складывать. Я стараюсь использовать фолд только там, где это необходимо.

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