• [^] # Re: Dans l'art voluptueuse de ne rien comprendre

    Posté par . En réponse au journal EDSL et F-algèbres. Évalué à 1. Dernière modification le 13 juin 2016 à 16:06.

    Que signifie la syntaxe : {expi = ...}

    C'est un "record" avec un champs expi. C'est juste pour contourner l'impossibilité de faire un "type exp = forall a.a algebre -> a", on "emballe" la fonction dans le champs expi d'un record, car dans ce cas on peut faire le forall en utilisant la syntaxe 'a. type-exp.

    Que signifie la syntaxe "fun {expi = e}"

    C'est la destruction par pattern-match, équivalent à "fun record -> let e = record.expi in ..."

    "e {...}"

    On réemballe notre fonction dans un record. Encore une fois, ça aurait été mieux de passer une fonction directement ("la closure") mais parce qu'on ne sait pas exprimer son type sans passer par ce contournement. On aurait pu utiliser un objet normalement ̧ca aurait été pareil. C'est le même problème que tu as en faisait.
    CORRECTION: sorry m'est trompé la en fait je crois que t'évalue ton expression justement, ton e = expri. Tu évalue ta closure, ton {} c'est ton dictionaire avec tes fonction "lit", "sub", etc.

    type 'a valfun = 'a * ('a -> ())
    let maliste = [ (2, fun _ -> ()); ("string", fun _ -> ()) ]
    (* marche pas car tous les éléments de la liste n'ont pas le même type "string valfun" contre "int valfun" *)
    (* versus *)
    type valfun = {valfun : 'a. 'a * ('a -> unit)}
    let malist = [ {valfun = (2, fun _ -> ())}; {valfun = ("string", fun _ -> ())}]
    List.iter (fun {valfun=(v,f)} -> f v) malist (* OK *)