Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 教堂用F编码的自由单子#_F#_Existential Type_Free Monad_Rank N Types - Fatal编程技术网

F# 教堂用F编码的自由单子#

F# 教堂用F编码的自由单子#,f#,existential-type,free-monad,rank-n-types,F#,Existential Type,Free Monad,Rank N Types,我试图用F#来表达自由单子的教会编码自由专用于特定的函子,效果 我可以同时编写return:'T->Free-Free->Free您不需要在那里执行任何操作,编译器建议的类型实际上是正确的(并且与runFree的类型一致) 似乎您在想的是Scott编码(摘自): 其中,fa将是您的效果-专门的免费>,这就是您尝试使用的 鉴于教会编码将是: runFree :: Functor f => (a -> r) -> (f r -> r) -> F f a -> r

我试图用F#来表达自由单子的教会编码<代码>自由专用于特定的函子,
效果


我可以同时编写
return:'T->Free-Free->Free您不需要在那里执行任何操作,编译器建议的类型实际上是正确的(并且与
runFree
的类型一致)

似乎您在想的是Scott编码(摘自):

其中,
fa
将是您的
效果
-专门的
免费>
,这就是您尝试使用的

鉴于教会编码将是:

runFree :: Functor f => (a -> r) -> (f r -> r) -> F f a -> r

fr
在哪里有效您可以查看代码示例吗?
Apply
的第二个参数没有键入check。@scrwtp,谢谢,现已修复。
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')
            )
...

(fun (a: Effect<Free<string*int>>) -> 
      ^^^^^^^^^^^^^^^^^^ ------ Expecting a Effect<string * int> but given a Effect<Free<string*int>>
runFree :: Functor f => (a -> r) -> (f (F f a) -> r) -> F f a -> r
runFree :: Functor f => (a -> r) -> (f r -> r) -> F f a -> r
let rec interpret (f: Free<string * int>) = 
    Free.runFree
        f
        (fun (str,len) -> (str,len))
        (fun (a: Effect<_>) -> 
            let (b,n) = interpretEffect a 
            let (c,n') = interpret (Free.pureF b)
            (c, n + n')
        )
let pureF (x: 'a) : Free<'a> = 
    { new Free<'a> with member __.Apply kp _ = kp x }