2015-12-03 3 views
2

мне интересно, если там было строительство Option.fold что бы сделать следующее None.**.asInstanceOf[Option[String]** ненужным:избежать слепок при использовании Option.fold в Скале

def getHiveDir(sqlc: SQLContext, tname: String, partColVals: Seq[(String, String)]): Option[String] = { 
    getHiveDir(sqlc, tname).fold(None.asInstanceOf[Option[String]]) { tloc => 
      // some stuff 
    } 
    Some(someString) 
} 

Как стоит выше .asInstanceOf[Option[String]] требуется или сборник возникает ошибка: None не признается как Option[String]

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

ответ

5

Выберите свой любимый:

scala> Option.empty[String] 
res1: Option[String] = None 

scala> None: Option[String] 
res2: Option[String] = None 

scala> None.asInstanceOf[Option[String]] 
res3: Option[String] = None 

Вы можете также определить тип аргумента явно для fold:

scala> val o: Option[Int] = None 
o: Option[Int] = None 

scala> o.fold[Option[Int]](None)(_ => Some(2)) 
res5: Option[Int] = None 

Есть случаи, когда умозаключение типа просто не имеет достаточно информации, чтобы выяснить тип. Это происходит на других языках, таких как Haskell. Таким образом, обычные способы помочь - либо указать тип с :, либо явно передать аргументы типа, как в приведенных выше примерах.

+0

«Любимый» Я думаю, вы имеете в виду «Наименее уродливый». Я поеду с вашим первым - Option.empty [Тип] – javadba

+0

Мне нравится ваш последний «вариант» лучше. – javadba

0

Для полноты:

Если вы используете scalaz, вы можете просто использовать none[String].

+0

Я работаю в различных средах и постоянно участвую в Scala. Но я не собираюсь сделать мир еще более сложным для программистов, не являющихся Scala, добавив scalaz/бесформенный. Это для магазинов с штатом, который уже прочен на этом языке. – javadba

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