馃嚜馃嚫 Tutoriales de Marlowe: 7. Marlowe integrado en Haskell

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.

MT-7-1

Recuerda que desarrollamos este contrato de Marlowe en nuestro anterior tutorial.
Aunque lo presentamos all铆 como un contrato 鈥渕onol铆tico鈥, podemos utilizar definiciones de Haskell para hacerlo m谩s legible. Para empezar, podemos separar el compromiso inicial de la parte interna del contrato:

MT-7-2

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:

MT-7-3

En estos contratos tambi茅n se utilizan abreviaturas sencillas como

MT-7-4

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.

MT-7-5

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

MT-7-6

y definir nuevas funciones (o 鈥減lantillas鈥) para nosotros. En este caso definimos

MT-7-7

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

MT-7-8

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 鈥減uro鈥 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

鈥 Este contrato est谩 contenido en el m贸dulo EscrowSimpleV2.hs https://github.com/input-output-hk/marlowe/blob/master/semantics-3.0/src/Language/Marlowe/Examples/EscrowSimpleV2.hs__
鈥 La versi贸n ampliada procede de Marlowe Playground, que permite ampliar las definiciones integradas en Marlowe puro.

漏 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