risposta di samthebest è probabilmente la vera ragione (non so, non è una cosa che conosco bene), ma c'è un altro modo di guardarlo che si riferisce alla programmazione funzionale più in generale.
E 'ben noto che corrisponde nella programmazione funzionale può essere fatto senza alcuna lingue particolari caratteristiche (Church Encoding)
trait List[+T] {
def mmatch[R](nil: => R, cons: (T, List[T]) => R): R
}
object Nil extends List[Nothing] {
def mmatch[R](nil: => R, cons: (Nothing, List[Nothing]) => R) = nil
}
class Cons[+T](head: T, tail: List[T]) extends List[T] {
def mmatch[R](nil: => R, cons: (T, List[T]) => R) = cons(head, tail)
}
def sum(l: List[Int]): Int = l mmatch (
nil = 0,
cons = (x, xs) => x + sum(xs)
)
val list = new Cons(1, new Cons(2, Nil))
println(sum(list))
In questa interpretazione, quando si scrive
sealed trait List[+T]
case object Nil extends List[Nothing]
case class Cons[+T](head: T, tail: List[T]) extends List[T]
la parola sealed
è il valore/termine che fornisce la funzione match
.
Quindi un modo di leggere la tua domanda è, perché non farlo? Perché non creare corrispondenze con altre funzionalità linguistiche di base anziché fornire una corrispondenza sintattica?
La ragione è che sintattica match
fornisce po 'di zucchero sintattico che le persone come:
sovrapposte funzione match:
sealed trait A
sealed trait B
case object X extends A
case object Y extends A with B
case object Z extends B
nidificate funzione match:
(1 :: 2 :: Nil) match {
case x :: y :: Nil => ???
}
Questo è molto imbarazzante scrivere senza zucchero sintattico. Puoi farlo; Ho provato ad esplorare la possibilità quando trying to implement monadic extractors; ma sicuramente è meno carino.
Selezione automatica delle funzioni di incontro aperto e chiuso.
Cioè, gli estrattori in Scala sono come le funzioni di corrispondenza aperta perché qualsiasi errore può restituire None
; il compilatore non verificherà la completezza di match
ma puoi concatenare quanti ne vuoi e Scala seleziona il primo. D'altra parte, i tratti sealed
forniscono funzioni di corrispondenza chiuse con il vantaggio del controllo di completezza. Questi dovrebbero essere forniti da funzioni separate, ma Scala consente di utilizzare la stessa sintassi match
per entrambi.
Personalmente ho il sospetto che i requisiti di cui sopra non richiedano, in definitiva, uno speciale supporto sintattico per le partite. Sospetto che altre caratteristiche linguistiche più generali possano finire per fornire lo stesso vantaggio, in particolare nell'area delle partite annidate. Tuttavia, per il momento è semplicemente più sensato colpire il problema direttamente con una speciale sintassi match
.
C'è qualche vantaggio nel rendere la corrispondenza implementata tramite macro? Soprattutto dato che esiste un * modello di corrispondenza virtualizzato *? –
@ om-nom-nom: non so - ho fatto la domanda per scopi di apprendimento/comprensione; ma chissà, rimuovere casi speciali a volte ha inizialmente benefici non ovvi. Inoltre, non sapevo nulla di * virtualized pattern matching * finora, ma lo sto verificando ora. –
@ om-nom-nom: basato su ciò che ho appena imparato da http://stackoverflow.com/questions/8533826/what-is-scalas-experimental-virtual-pattern-matcher, risponderei "sì" a la seconda parte della tua domanda. –