Como faço para criar uma matriz heterogênea em Scala?

votos
28

Em javascript, o que podemos fazer:

[a string, 10, {x : 1}, function() {}].push(another value);

Qual é o equivalente Scala?

Publicado 09/10/2008 em 06:00
fonte usuário
Em outras línguas...                            


4 respostas

votos
40

Arrays em Scala são muito homogênea. Isso ocorre porque Scala é uma linguagem de tipagem estática. Se você realmente precisa de recursos pseudo-heterogêneo, você precisa usar uma estrutura de dados imutáveis que é parametrizada covariantemente (estruturas de dados mais imutáveis são). Listé o exemplo canônico lá, mas Vectoré também uma opção. Então você pode fazer algo como isto:

Vector("a string", 10, Map("x" -> 1), ()=>()) + "another value"

O resultado será do tipo Vector[Any]. Não é muito útil em termos de tipagem estática, mas tudo vai estar lá, como prometido.

Aliás, o "sintaxe literal" para matrizes em Scala é a seguinte:

Array(1, 2, 3, 4)     // => Array[Int] containing [1, 2, 3, 4]

Veja também : Mais informações sobre vetores persistentes

Respondeu 09/10/2008 em 18:08
fonte usuário

votos
4

Scala pode ter a capacidade para uma lista "heterogêneo" em breve: hList em Scala

Respondeu 15/10/2008 em 18:53
fonte usuário

votos
18

Scala vai escolher o tipo de elemento de matriz mais específico que pode conter todos os valores, neste caso, precisa o tipo mais geral Anyque é um supertipo de todos os outros tipos:

Array("a string", 10, new { val x = 1 }, () => ()) :+ "another value"

A matriz resultante será do tipo Array[Any].

Respondeu 23/05/2011 em 01:38
fonte usuário

votos
2

Pessoalmente, eu provavelmente usaria tuplas, como herom menciona em um comentário.

scala> ("a string", 10, (1), () => {})
res1: (java.lang.String, Int, Int, () => Unit) = (a string,10,1,<function0>)

Mas você não pode anexar a tais estruturas facilmente.

O hList mencionado por ePharaoh é "feito para isso", mas eu provavelmente ficaria clara do que eu. É pesado no tipo de programação e, portanto, pode transportar cargas surpreendentes com ele (isto é, a criação de um monte de aulas quando compilado). Apenas tenha cuidado. A hList do acima (precisa biblioteca MetaScala) seria (não comprovada desde que eu não use MetaScala):

scala> "a string" :: 10 :: (1) :: () => {} :: HNil

Você pode acrescentar etc. (bem, pelo menos preceder) a uma tal lista, e vai conhecer os tipos. Prepending cria um novo tipo que tem o tipo velho como a cauda.

Em seguida, há uma abordagem ainda não mencionados. Classes (especialmente aulas de caso) são muito leves no Scala e você pode torná-los como one-liners:

scala> case class MyThing( str: String, int: Int, x: Int, f: () => Unit )
defined class MyThing

scala> MyThing( "a string", 10, 1, ()=>{} )
res2: MyThing = MyThing(a string,10,1,<function0>)

Claro, isso não vai lidar com anexando também.

Respondeu 20/11/2012 em 08:58
fonte usuário

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