Por que a cadeia vazia não corresponder como Seq.empty?

votos
2

EDIT: Este foi um bug de idade muito que fixa em Scala 2,8 e mais tarde

Durante algumas experiências em torno questão Padrão combinando uma String como Seq [Char] , deparei com um outro fenômeno correspondência estranho. Considere o seguinte código que trata uma seqüência como uma seqüência de caracteres:

def %%&#(input: String) : String =  {
    val uha : Seq[Char] = input
    uha match {
        case Seq() => Empty
        case Seq(first @ _, 'o', 'o')  => Bar
        case _ => Oh 
    }
}

Chamando entrada na corda vazia produz corretamente Empty.

No entanto, se eu reescrever a primeira cláusula partida como

case Seq.empty => Empty

a correspondência de falha e coincide com a cláusula padrão em vez disso.

Andando pelo código fonte biblioteca Scala (que você não deveria ter que fazer em um mundo ideal :-)) Eu acredito que tanto Seq()e Seq.emptyirá resultar em RandomAccessSeq.empty. Aparentemente, este não coincide com o fenómeno descrito acima porque só Seq()corresponde a sequência de vazio.

UPDATE: Após alguma experimentação adicional esta questão pode ser reduzida para o seguinte:

val list = List()
   >>> list2: List[Nothing] = List()
val emptySeq = Seq.empty
list == emptySeq
   >>> res1: Boolean = false

Isto significa basicamente que um vazio Seqnão faz automaticamente igual Seq.empty. Então, quando a comparação com uma constante (em vez de usar um extrator como sugerido por starblue) esta desigualdade leva ao jogo falha. O mesmo é verdade quando se interpretam o vazio Stringcomo uma sequência.

Publicado 11/04/2009 em 20:26
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

Em combinar as funções de cancelar a aplicação ou unapplySeq são utilizados, não se aplicar como você parece acreditar.

Respondeu 11/04/2009 em 21:16
fonte usuário

votos
4

Este parece ser um bug na biblioteca. Você quer arquivar o bug ou devo?

scala> Seq.empty  match {case Seq() => "yup"; case _ => "nope"}
res0: java.lang.String = yup

scala> Seq()  match {case Seq.empty => "yup"; case _ => "nope"}
res1: java.lang.String = yup

scala> ("" : Seq[Char]) match {case Seq() => "yup"; case _ => "nope"}    
res2: java.lang.String = yup

scala> ("" : Seq[Char]) match {case Seq.empty => "yup"; case _ => "nope"}
res3: java.lang.String = nope
Respondeu 12/04/2009 em 00:56
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more