2011-02-01 2 views
4

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

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

ответ

5

Соответствие шаблону - это языковая функция, в которой оператор match является только самым заметным примером. Вот два других часто используемых примера:

val List(x,y,(z: Int,w: Int)) = List("one","two",(3,4)) 
for ((text,i) <- List(("one",1),("two",2))) println(text + " = " + i) 

Итак, нет, вы не можете сделать это самостоятельно. Язык не позволяет вам определять новые способы создания переменных, так что это может произойти только при поддержке языка.

Сам оператор match использует поддержку создания переменных, поддерживающую шаблон, внутри языка, но в принципе может быть реализован как функция библиотеки. Тем не менее, было бы неэффективным в нескольких случаях:

// This is implemented with fast jumps, not slow if-then-else! 
n match { 
    case 0 => // Do action 0 
    case 1 => // Do action 1 
    case 2 => // Do action 2 
    case _ => // Do default action 
} 

// This is tail recursive, so you won't overflow the stack! 
def recursiveMatch(xs: List[Any]): List[Any] = xs match { 
    case (x @ Int) :: rest => recursiveMatch(rest) 
    case _ => xs 
} 

Так, в конце концов, нет, вы не можете писать по шаблону себя, и в то время как вы могли бы написать заявление матча, есть преимущества в использовании существующих один.

2

Соответствие шаблону - определенно языковая функция. Тем не менее, поскольку запись структур управления потоком в Scala настолько проста (и сопоставление шаблонов является надежным), вы можете легко написать свой собственный match (по сравнению с другими языками).

match, с другой стороны, по-прежнему является частью ядра языка (я думаю), но он ведет себя гораздо больше как что-то в библиотеке. Он чувствует себя настолько органичным из-за того, насколько сильным является сопоставление образцов.

Это, конечно, можно переписать match.

+0

В этом ответе, похоже, нет реального ответа. Это пушистые слова и похвалы ... – ziggystar

4

На самом деле, match был использован в библиотеке, я слышал. Журнал изменений в справочнике Scala указывает, что match стал зарезервированным ключевым словом на версии 2.0, после чего object.match { ... } также перестает быть сильным синтаксисом.

Это довольно легко реализовать в принципе:

implicit def toMyMatch[T](obj: T) = new { 
    def myMatch[R](f: T => R) = f(obj) 
} 

Я не знаю точные причины, почему она перестала быть реализована таким образом.

+1

Точные причины? Вероятно, потому что «совпадение» как метод предотвращает оптимизацию хвостового вызова на хвостовых вызовах, выполненных внутри частичной функции. –

+0

как это разрешить анализ ситуации? –

+1

@pelotom 'f' должен быть частичной функцией для этого. Я бы изменил фрагмент выше на что-то вроде 'def myMatch [R] (f: PartialFunction [T, R]) = f (obj)' –

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