Parlez d' Elm .
Elm est un langage de programmation fonctionnel pour le développement frontend. La syntaxe est similaire à Haskell, mais considérablement simplifiée et spécialisée. Le code source de l'orme se compile en JavaScript natif. Le code JavaScript compilé contient le code d'application qui contrôle la sous-arborescence DOM.
Orme. Confortable et maladroit. La composition
Orme. Confortable et maladroit. Json.Encoder et Json.Decoder
Orme. Confortable et maladroit. Http, Task
L'élément principal de l' architecture du langage Elm est l'application. En général, chaque application contient:
- État ou modèle. Données décrivant l'état actuel de l'application;
- Beaucoup de messages valides. Les messages sont envoyés lorsque des événements se produisent (disons qu'un bouton est cliqué) et remis à la fonction de mise à jour;
- Une fonction de vue qui, en fonction de l'état, génère une nouvelle arborescence DOM;
- La fonction de mise à jour, qui prend un modèle et un message, et renvoie un nouveau modèle et les effets requis;
- Fonction d'abonnement, abonnement aux notifications d'événements. Au cœur de la langue, il y a des abonnements à la minuterie, à WebSocket et plus encore.
Dactylographie
Tout doit être tapé. En conséquence, vérification de la cohérence du code statique. S'il est compilé, cela devrait fonctionner. Mais cela fonctionnera comme vous vous y attendez ou non - aucune garantie. Cela simplifie considérablement le refactoring.
Modèle
Le modèle est un type personnalisé. Les types personnalisés sont construits à partir de:
- Tapez des alias pour décrire les structures;
- Types d'union pour décrire les associations de types valides;
- types de base Int, String et autres.
Les types d'union vous permettent de déclarer des types balisés. Par exemple, prenez une description du type d'utilisateur:
type User = Anonymous | User String
Le type déclaré contient des informations sur le type d'utilisateur et ses données, s'il est autorisé. Sinon, l'utilisateur est anonyme.
La frontière
La frontière entre le runtime Elm et l'environnement externe via les décodeurs. Decoder (Json.Decode) est une fonction qui accepte JSON et renvoie un type Elm. Lors de l'exécution de Json.Decode.decodeString ou Json.Decode.decodeValue , la structure des données d'entrée et la correspondance des types sont vérifiées.
Le décodeur renvoie un type de résultat qui contient des données, en cas de succès, ou une erreur.
Afficher
Une vue est une fonction d'état qui renvoie des informations pour générer une arborescence DOM. Un exemple:
view : Model -> Html.Html Msg view model = case model.user of Anonymous -> Html.div [] [ Html.text “Anonymous” ] User name -> Html.div [] [ Html.text (“Welcome ” ++ name) ]
Les fonctions sont utilisées pour générer des nœuds DOM. Dans les projets de combat, la vue est une composition de fonctions d'ordre plus général. Par exemple:
view : Model -> Html.Html Msg view model = case model.user of Anonymous -> anonymousView User name -> userView name
anonymousView et userView sont des fonctions utilisateur qui génèrent de petites parties de l'interface.
Mutations (mise à jour)
Tous les événements (actions utilisateur, réseau, etc.) génèrent des messages qui sont remis à la fonction enregistrée lors de l'initialisation. Par défaut, cette fonction est nommée mise à jour. La fonction prend un événement et un modèle, et renvoie un nouveau modèle et des commandes. Les commandes sont exécutées dans le runtime Elm et peuvent également générer des événements.
Par exemple, incrémenter une variable lorsqu'un bouton est enfoncé:
update : Model -> Msg -> (Model, Cmd Msg) update model msg = case msg of OnClick -> ({model | clicked = model.clicked + 1}, Cmd.none)
Souscrire
L'abonnement aux événements se produit au démarrage de l'application et est appelé à chaque fois que le modèle est modifié.
Si un événement se produit, ils sont transmis à la fonction de mise à jour.
Par exemple, un abonnement à une minuterie d'une durée de 10 secondes. Lorsque vous atteignez 10 secondes, un message Tick est généré et envoyé à la fonction de mise à jour:
subscribe : Model -> Sub Msg subscribe model = Time.every 10 Tick
Les sources