Marlowe integrado en Haskell

En este tutorial volvemos al ejemplo de custodia, y mostramos cómo podemos utilizar la integración de Marlowe en Haskell para hacer descripciones más legibles, modulares y reutilizables de los contratos de Marlowe.

Un simple contrato de custodia, revisitado.

Recuerda que desarrollamos este contrato de Marlowe en nuestro anterior tutorial.

Aunque lo presentamos allí como un contrato "monolítico", podemos utilizar definiciones de Haskell para hacerlo más legible. Para empezar, podemos separar el compromiso inicial de la parte interna del contrato:

Muchos de los términos aquí están definidos en Haskell. Principalmente, tenemos los dos contratos que se ocupan de lo que sucede cuando hay agreement entre Alice y Bob, y si no, cómo debería Carol arbitrate entre ellos:

En estos contratos también se utilizan abreviaturas sencillas como

que indica el precio del gato, y por tanto el valor del dinero en custodia.

También podemos describir las elecciones realizadas por Alice y Bob, observando que también se nos pide un valor por defecto defValue por si acaso no se han hecho las elecciones.

Al describir las opciones, podemos dar nombres sensatos a los valores numéricos:

y definir nuevas funciones (o "plantillas") para nosotros. En este caso definimos

como una forma de hacer la expresión de las opciones algo más simple y legible:

Teniendo en cuenta todas estas definiciones, podemos redactar el contrato al principio de esta sección de forma que quede clara su intención. Escribiendo en "puro" Marlowe, o ampliando estas definiciones, tendríamos en cambio este contrato:

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)))

      ]

Ejercicios

¿Qué otras abreviaturas podrías añadir al contrato en la parte superior de la página?

¿Puedes identificar alguna función que puedas definir para hacer el contrato más corto o más modular?

Este ejemplo ha mostrado cómo la integración en Haskell nos proporciona un lenguaje más expresivo, simplemente reutilizando algunas de las características básicas de Haskell, concretamente las definiciones de constantes y funciones. En el siguiente tutorial aprenderás a definir contratos utilizando la integración de JavaScript en su lugar.

Nota

 

© Copyright 2020, IOHK Revision 67575b15.

Encuentra una copia oficial de este documento aquí:

https://alpha.marlowe.iohkdev.io/doc/marlowe/tutorials/embedded-marlowe.html

https://docs.cardano.org/projects/plutus/en/latest/marlowe/tutorials/embedded-marlowe.html

 

Más traducciones de Cardano en: Cardano For The World