🇫🇷 Tutoriels de Marlowe: 7. Marlowe integré dans Haskell

Marlowe integré dans Haskell

Dans ce tutoriel, nous revenons à l’exemple du séquestre et montrons comment nous pouvons utiliser l’intégration de Marlowe dans Haskell pour faire des descriptions plus lisibles, modulaires et réutilisables des contrats Marlowe…

Un simple contrat de séquestre, revisité.

MT-7-1

Rappelons que nous avons développé ce contrat Marlowe dans notre précédent tutoriel.
Bien que nous l’ayons présenté comme un contrat “monolithique”, nous pouvons utiliser des définitions Haskell pour le rendre plus lisible. Pour commencer, nous pouvons séparer l’engagement initial de la partie interne du contrat:

MT-7-2

La plupart des termes utilisés ici sont eux-mêmes définis dans Haskell. Principalement, nous avons les deux contrats qui traitent de ce qui se passe quand il y a agreement entre Alice et Bob, et si ce n’est pas le cas, comment Carol devrait-elle arbitrate entre eux:

MT-7-3

Dans le cadre de ces contrats, nous utilisons également des abréviations simples telles que

MT-7-4

qui indique le prix du chat, et donc la valeur de l’argent sous séquestre.
Nous pouvons aussi décrire les choix faits par Alice et Bob, en notant que l’on nous demande aussi une valeur par défaut defValue au cas où les choix n’auraient pas été faits.

MT-7-5

Pour décrire les choix, nous pouvons donner des noms sensés aux valeurs numériques:

MT-7-6

et définir de nouvelles fonctions (ou “modèles”) pour nous-mêmes. Dans ce cas, nous définissons

MT-7-7

comme un moyen de rendre l’expression des choix un peu plus simple et plus lisible:

MT-7-8

Compte tenu de toutes ces définitions, nous sommes en mesure d’écrire le contrat au début de cette section d’une manière qui rend son intention claire. En écrivant en “pur” Marlowe, ou en développant ces définitions, nous aurions ce contrat à la place:

When [
  (Case
     (Deposit
        "alice" "alice" ada
        (Constant 450))
     (When [
           (Case
              (Choice
                 (ChoiceId "choice" "alice") [
                 (Bound 0 1)])
              (When [
                 (Case
                    (Choice
                       (ChoiceId "choice" "bob") [
                       (Bound 0 1)])
                    (If
                       (ValueEQ
                          (ChoiceValue
                             (ChoiceId "choice" "alice"))
                          (ChoiceValue
                             (ChoiceId "choice" "bob")))
                       (If
                          (ValueEQ
                             (ChoiceValue
                                (ChoiceId "choice" "alice"))
                             (Constant 0))
                          (Pay
                             "alice"
                             (Party "bob") ada
                             (Constant 450) Close) Close)
                       (When [
                             (Case
                                (Choice
                                   (ChoiceId "choice" "carol") [
                                   (Bound 1 1)]) Close)
                             ,
                             (Case
                                (Choice
                                   (ChoiceId "choice" "carol") [
                                   (Bound 0 0)])
                                (Pay
                                   "alice"
                                   (Party "bob") ada
                                   (Constant 450) Close))] 100 Close)))] 60
                 (When [
                       (Case
                          (Choice
                             (ChoiceId "choice" "carol") [
                             (Bound 1 1)]) Close)
                       ,
                       (Case
                          (Choice
                             (ChoiceId "choice" "carol") [
                             (Bound 0 0)])
                          (Pay
                             "alice"
                             (Party "bob") ada
                             (Constant 450) Close))] 100 Close)))
      ]

Exercices

Quelles autres abréviations pourriez-vous ajouter au contrat en haut de la page ?
Pouvez-vous identifier des fonctions que vous pourriez définir pour rendre le contrat plus court, ou plus modulaire ?
Cet exemple a montré comment l’intégration dans Haskell nous donne un langage plus expressif, simplement en réutilisant certaines des caractéristiques de base de Haskell, à savoir les définitions des constantes et des fonctions. Dans le prochain tutoriel, vous apprendrez à définir des contrats en utilisant plutôt l’intégration JavaScript.

Note

• Ce contrat est contenu dans le module EscrowSimpleV2.hs https://github.com/input-output-hk/marlowe/blob/master/semantics-3.0/src/Language/Marlowe/Examples/EscrowSimpleV2.hs__
• La version étendue provient du Marlowe Playground, qui prend en charge l’extension des définitions intégrées en Marlowe pur.

© Copyright 2020, IOHK Revision 67575b15.
Vous trouverez une copie officielle de ce document ici :
https://alpha.marlowe.iohkdev.io/doc/marlowe/tutorials/embedded-marlowe.html
https://docs.cardano.org/projects/plutus/en/latest/marlowe/tutorials/embedded-marlowe.html

Plus de traductions de Cardano Ă : Cardano For The World