J'essaye d'exprimer l'encodage d'église de la monade libre dans F #. Free
est spécialisée dans un foncteur particulier, Effect
.L'église a codé Monad libre dans F #
Je suis capable d'écrire à la fois return_ : 'T -> Free<'T>
et bind: ('T -> Free<'U>) -> Free<'T> -> Free<'U>
sans aucun problème.
Une esquisse de ma mise en œuvre est donnée ci-dessous. Lorsque j'essaye d'écrire un interpréteur pour cet encodage, je rencontre un problème.
Vu le code suivant:
module Interpret =
let interpretEffect = function
| GetStr k ->
let s = System.Console.ReadLine()
(k s , String.length s)
| PutStr(s,t) ->
do System.Console.WriteLine s
(t , 0)
let rec interpret (f: Free<string * int>) =
Free.runFree
f
(fun (str,len) -> (str,len))
(fun (a: Effect<Free<string*int>>) ->
let (b,n) = interpretEffect a
let (c,n') = interpret b
(c, n + n')
)
je reçois une erreur de type dans le troisième argument à Free.runFree
dans la fonction interpret
:
...
(fun (a: Effect<Free<string*int>>) ->
^^^^^^^^^^^^^^^^^^ ------ Expecting a Effect<string * int> but given a Effect<Free<string*int>>
Je comprends pourquoi cela se passe (le type de résultat de la première fonction détermine 'R === string*int
) et soupçonne que cela peut être résolu en utilisant une fonction de rang 2 (qui peut être codée en F # par exemple http://eiriktsarpalis.github.io/typeshape/#/33) mais je ne suis pas sûr de la façon de l'appliquer.
Tous les pointeurs seraient très appréciés.
Michael
Pouvez-vous revoir vos exemples de code? Le second argument de 'Apply' ne tape pas check. – scrwtp
@scrwtp, merci, corrigé maintenant. –