F #에서 무료 모나드의 교회 인코딩을 표현하려고합니다. Free
은 특정 기능자인 Effect
에 특화되어 있습니다.Church encoded Free monad in F #
return_ : 'T -> Free<'T>
과 bind: ('T -> Free<'U>) -> Free<'T> -> Free<'U>
을 아무런 문제없이 쓸 수 있습니다.
내 구현 스케치는 아래와 같습니다.
이 인코딩을 위해 인터프리터를 작성하려고하면 문제가 발생합니다.
주어진 다음의 코드 :
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')
)
은 내가 interpret
함수 내에서 Free.runFree
에 세 번째 인수의 형식 오류 :이의 (결과 유형을 일어나는 이유
...
(fun (a: Effect<Free<string*int>>) ->
^^^^^^^^^^^^^^^^^^ ------ Expecting a Effect<string * int> but given a Effect<Free<string*int>>
내가 이해 첫 번째 함수는 'R === string*int
을 결정합니다.) 그리고 rank-2 함수 (F # # http://eiriktsarpalis.github.io/typeshape/#/33과 같이 인코딩 할 수 있음)를 사용하여 해결할 수 있다고 생각하지만 적용 방법을 잘 모르겠습니다.
모든 포인터가 많이 감사하겠습니다.
마이클
코드 샘플을 검토 할 수 있습니까? 'Apply'의 두번째 인수는 타입 체크를하지 않습니다. – scrwtp
@scrwtp, 감사합니다. 지금 수정되었습니다. –