Recherche…


Tuples

Les tuples sont des listes ordonnées de valeurs de tout type.

(True, "Hello!", 42)

Il est impossible de modifier la structure d'un tuple ou de mettre à jour la valeur.

Les tuples dans Elm sont considérés comme un type de données primitif, ce qui signifie que vous n'avez pas besoin d'importer de modules pour utiliser Tuples.

Accéder aux valeurs

Le module Basics a deux fonctions d'aide pour accéder aux valeurs d'un Tuple d'une longueur de deux ( a, b ) sans utiliser de correspondance de motif:

fst (True, "Hello!") -- True
snd (True, "Hello!") -- "Hello!"

Les valeurs d'accès des tuples de plus grande longueur se font par correspondance de motif.

Correspondance de motif

Les tuples sont extrêmement utiles en combinaison avec la correspondance de motif:

toggleFlag: (Sting, Bool) -> (Sting, Bool)
toggleFlag (name, flag) =
    (name, not flag)

Remarques sur les tuples

Les tuples contiennent moins de 7 valeurs de type de données comparable

Dictionnaires

Les dictionnaires sont implémentés dans une bibliothèque principale de Dict .

Un dictionnaire mappant des clés uniques sur des valeurs. Les clés peuvent être de type comparable. Cela inclut Int, Float, Time, Char, String et des tuples ou des listes de types comparables.

Les opérations d'insertion, de suppression et de requête prennent toutes l'heure O (log n).

Contrairement aux tuples et aux enregistrements, les dictionnaires peuvent modifier leur structure. En d'autres termes, il est possible d'ajouter et de supprimer des clés.

Il est possible de mettre à jour une valeur par une clé.

Il est également possible d'accéder ou de mettre à jour une valeur à l'aide de clés dynamiques.

Accéder aux valeurs

Vous pouvez extraire une valeur d'un dictionnaire en utilisant une fonction Dict.get .

Définition de type de Dict.get :

get : comparable -> Dict comparable v -> Maybe v

Il renverra toujours Maybe v , car il est possible d'essayer d'obtenir une valeur par une clé inexistante.

import Dict

initialUsers =
      Dict.fromList [ (1, "John"), (2, "Brad") ]

getUserName id =
  initialUsers
  |> Dict.get id
  |> Maybe.withDefault "Anonymous"
  
getUserName 2 -- "Brad"
getUserName 0 -- "Anonymous"

Mise à jour des valeurs

L'opération de mise à jour sur un dictionnaire est effectuée à l'aide de Maybe.map , car la clé demandée peut être absente.

import Dict

initialUsers =
  Dict.fromList [ (1, "John"), (2, "Brad") ]

updatedUsers =
  Dict.update 1 (Maybe.map (\name -> name ++ " Johnson")) initialUsers

Maybe.withDefault "No user" (Dict.get 1 updatedUsers) -- "John Johnson"

Des dossiers

Record est un ensemble de paires clé-valeur.

greeter =
    { isMorning: True
    , greeting: "Good morning!"
    }

Il est impossible d'accéder à une valeur par une clé inexistante.

Il est impossible de modifier dynamiquement la structure de Record.

Les enregistrements vous permettent uniquement de mettre à jour les valeurs par des clés constantes.

Accéder aux valeurs

Il est impossible d'accéder aux valeurs à l'aide d'une clé dynamique pour éviter d'éventuelles erreurs d'exécution:

isMorningKeyName =
    "isMorning "


greeter[isMorningKeyName] -- Compiler error
greeter.isMorning -- True

La syntaxe alternative pour accéder à la valeur vous permet d'extraire la valeur, tout en parcourant l'enregistrement:

greeter
    |> .greeting
    |> (++) " Have a nice day!" -- "Good morning! Have a nice day!"

Extension de types

Parfois, vous souhaitez que la signature d'un paramètre contraigne les types d'enregistrement que vous transmettez à des fonctions. L'extension des types d'enregistrement rend l'idée de supertypes inutile. L'exemple suivant montre comment ce concept peut être implémenté:

type alias Person =
    { name : String
    }


type alias Animal =
    { name : String
    }


peter : Person
peter =
    { name = "Peter" }


dog : Animal
dog =
    { name = "Dog" }


getName : { a | name : String } -> String
getName livingThing =
    livingThing.name


bothNames : String
bothNames =
    getName peter ++ " " ++ getName dog

Nous pourrions même aller plus loin dans les enregistrements et faire quelque chose comme:

type alias Named a = { a | name : String }
type alias Totalled a = { a | total : Int }


totallyNamed : Named ( Totalled { age : Int })
totallyNamed =
  { name = "Peter Pan"
  , total = 1337
  , age = 14
  }

Nous avons maintenant des moyens de faire passer ces types partiels dans des fonctions:

changeName : Named a -> String -> Named a
changeName a newName =
  { a | name = newName }
  
cptHook = changeName totallyNamed "Cpt. Hook" |> Debug.log "who?"

Mise à jour des valeurs

Elm a une syntaxe spéciale pour les mises à jour des enregistrements:

model =
    { id: 1
    , score: 0
    , name: "John Doe"
    }


update model =
    { model
       | score = model.score + 100
       | name = "John Johnson"
    }


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow