9
votes

Comment définir une liste de listes dans Scala?

Je voudrais créer un stockage pour le type suivant: xxx pré>

mais si je fais ce qui suit: p> xxx pré>

alors Crée comme liste [Anyval] et me donne une erreur si j'essaie d'effectuer une opération mathématique: P>

y(0)(0) * 2         // Error - value '2' is not a member of AnyVal


0 commentaires

5 Réponses :


5
votes

Vous pouvez trouver ce lien utile: http://debasishg.blogspot.com/ 2009/01 / supérieure-ordres-abstractions-in-scala-with.html

du lien ci-dessus Voici un exemple de liste des listes: P>

var y : List[List[Float]] = ...


0 commentaires

1
votes

Couple de remarques: xxx pré>

Signification, comme la question " Java: ma méthode veut le double type au lieu de flotter? ": P>

Le 'F' à la fin du nombre en fait un flotteur au lieu d'un double.
Java ne ménagera pas automatiquement un double à un flotteur. P> blockquote>


xxx pré>

fonctionne trop p>


Il suffirait d'ajouter le type explicite ne suffirait pas: P>

scala> var f : Float = -2.1
<console>:4: error: type mismatch;
 found   : Double(-2.1)
 required: Float
       var f : Float = -2.1
                       ^

scala> var f : Float = -2.1f
f: Float = -2.1


0 commentaires

8
votes

Dans vos deux exemples une liste, une liste contient un numéro d'int (1 dernier dans le premier cas et 2 comme premier élément de la deuxième liste), le reste des numéros est double. Par conséquent, le type déduit des éléments de liste sera anyval, qui est le premier Superype commun d'eux, de sorte que votre liste extérieure deviendra liste [Liste [Anyval]].

Si vous l'essayez également avec SCALA 2.8, il devrait utiliser Numérique au lieu de Anyval, car il est devenu le Superype de double et d'int. Les opérations les plus numériques (multiplication dans votre cas) y travailleront également sur eux.

Pour résoudre votre problème avec 2.7.x Utilisez simplement des doubles pour ces valeurs (1.0 ou 1D).

déclarer explicitement le type comme liste [liste [double]] aidera également également. Dans ce cas, les valeurs INT que vous avez données seront converties en doubles.


0 commentaires

0
votes
var y:List[List[Double]] = List(List (1.0, 2.2), List(2, 1.1, -2.1))

y(0)(0)*2

0 commentaires

1
votes

Cela semble avoir été corrigé dans SCALA 2.9

Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> var y = List(List (1.0, 2.2), List(2, 1.1, -2.1))
y: List[List[Double]] = List(List(1.0, 2.2), List(2.0, 1.1, -2.1))

scala> y(0)(0) * 2
res0: Double = 2.0


0 commentaires