2015-05-03 6 views
2

Я читаю SCALA книгу, и они используют два различных тип минусов операторов при выполнении шаблона на последовательность и спискиразница между Scala «+:» и «::»

+: 

:: 

обычно большинство функциональных языков используют :: как cons. Я не знаю, почему у scala есть 2 разных типа операторов для минусов.

Я тоже искал эту тему ... но не нашел ничего значимого.

Спасибо за ответ ниже. Я понял из этого, что +: является общим оператором и :: специфичен для списков. Но мой, возможно, следующий вопрос: почему scala использует двух операторов. почему бы не просто использовать один ::

ответ

7
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] { 
    override def tail : List[B] = tl 
    override def isEmpty: Boolean = false 
} 

и

override def +:[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That = bf match { 
    case _: List.GenericCanBuildFrom[_] => (elem :: this).asInstanceOf[That] 
    case _ => super.+:(elem)(bf) 
} 

что проясняет - :: принимает список и производит список, в то время как +: более общий вид, что можно построить другие коллекции - например Вектор или ArrayBuffer.

+0

, но зачем иметь 2? большинство других функциональных языков имеют только '::' и могут обрабатывать как буфер списка, так и вектор и массив. Какая необходимость иметь одну специализированную форму для списков и другую более общую форму для векторов и массивных буферов? –

+0

«большинство других функциональных языков просто имеют :: и могут обрабатывать как буфер списка, так и вектор и буфер массива» - я скептически отношусь к этому, это правда. какой язык (ы) вы имеете в виду? –

+0

Я немного закодировал F # (который, я считаю, очень похож на OCAML). и из того, что я помню, я всегда использовал '::'. Я не эксперт ... –

3

Что касается вашего последующего вопроса :: является скорее наследием более ранней реализации Scala, которая пыталась иметь подобный синтекс с существующими функциональными языками. Используйте +:, который более согласован.