F# 教堂用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
效果
我可以同时编写
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 }