8
votes

Répéter une liste dans Scala

Je suis un Scala noob. J'ai décidé d'écrire une araignée solitaire solitaire comme premier exercice pour apprendre la langue et la programmation fonctionnelle en général.

Je voudrais générer un jeu de cartes de 1, 2 ou 4 costumes. Voici ce que je suis venu avec: xxx

qui devrait renvoyer xxx

en fonction de la valeur des numéros de numéros, sauf là-bas Aucune liste "Multiplier" de liste que je peux trouver. Ai-je manqué? Existe-t-il un meilleur moyen de générer le pont complet avant de se dépasser?

BTW, je prévois d'utiliser une énumération pour les costumes, mais il était plus facile de taper ma question avec des chaînes. Je prendrai la liste générée ci-dessus et en utilisant une compréhension, itérale sur les costumes et une liste similaire de la carte "rangs" pour générer un pont complet.


1 commentaires

La partie intéressante de ce projet créera les générations immuables du tableau (mise en page actuelle des cartes). Je demande au tableau actuel pour une liste de mouvements légaux, renvoyés sous forme de tuples de (colonne source, colonne de destination et position source). J'applique ensuite chacun au tableau actuel de manière récursive en utilisant une sorte d'algorithme mini-max pour trouver le "meilleur" mouvement. Je souhaite aussi que l'objet de la carte soit immuable, de sorte que les tableaux ("Tableaux?") Devront savoir si une carte est confrontée.


4 Réponses :


19
votes

aplaticez une liste finie des listes: xxx pré>

aplaticez un flux de listes infini, prenez les premiers n éléments: p>

scala> Stream.continually(List(1, 2, 3, 4)).flatten.take(8).toList
res19: List[Int] = List(1, 2, 3, 4, 1, 2, 3, 4)


2 commentaires

Est-ce une nouvelle méthode en 2.8.0? Je ne pouvais pas le faire travailler, mais cela fait: Val costumes = liste ("clubs", "diamants", "cœurs", "pique"); List.flaTEN (list.make (4, costumes.take (1))), où le "1" est la valeur de "1".


Oui, certains d'entre eux sont nouveaux en 2.8.



6
votes

Vous pouvez développer une séquence numérique et platmap code> au lieu de la multiplication.

scala> List(1,2,3)*4
res2: List[Int] = List(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3)


1 commentaires

Dans SCALA 2.13.4, Scala> Liste (1,2,3) * 4 Soulevez une erreur: Erreur: valeur * n'est pas membre de la liste [int]



7
votes

Vous devriez rechercher Scaladoc pour l'objet Liste code>. Il a toutes les manières de méthodes intéressantes de création de listes. Par exemple, ce qui suit est exactement ce que vous essayiez de:

List.tabulate(4)(i => suits.apply(i % numberOfSuits))


4 commentaires

J'ai essayé votre exemple, mais obtenez une erreur sur 2.8.0.BETA1-PRERELEASe. En fait, j'obtiens cette erreur sur la plupart des échantillons de liste .Tabulat que je peux trouver. Ce qui donne? SCALA> LIST.TABULE (4, I => SUITS.Apply (I% Numberofsuits)) : 5: Erreur: Type de paramètre manquant Liste.Tabulate (4, i => costumes.apply (i% numbersuits)) Scala > List.Tabulat (4, (I: INT) => SUITS.Apply (i% Numberofsuits)) : 7: Erreur: Valeur de la méthode surchargée Tabâte avec des alternatives ... impossible d'appliquer à (int, (int, ) => java.lang.string) liste.Tabuler (4, (i: int) => costumes.apply (i% numbersuits)) ^


@Adam La syntaxe a légèrement changé de 2,7 à 2,8. Voir la réponse éditée.


Drôle, tu devrais le mentionner. J'ai oublié que les Docs Singleton étaient au bas des pages Doc Package. Dans le commentaire que j'ai écrit ci-dessus, j'ai proposé la même réponse exacte la même réponse que vous avez offerte d'abord ci-dessus.


Ce code ici list.tabulate (4, i => costumes.apply (i% numbersuits)) ne nécessite pas appliquer appel. Je changerais cela en List.Tabuler (4, I => Costudes (i% Numberofsuits))



0
votes

Si vous utilisez la bibliothèque code> CATS CODE>, vous pouvez utiliser SEMRUROUP CODE> METHE Combinen code>. Il répète une liste n code> fois.

import cats.implicits._
import cats.syntax.semigroup._

scala> List("clubs", "diamonds", "hearts", "spades").combineN(2)
res1: List[String] = List(clubs, diamonds, hearts, spades, clubs, diamonds, hearts, spades)


1 commentaires

@ Saibō Que CATS utilisez-vous?