이 질문은 영감을 얻었습니다 this question. 예제 (ListBuilder
)를 이해했지만 상태 모나드에 대해 while
루프를 만들지 못했습니다. 나에게 명확하지 않은 것은 bind
의 몸체 인 while
루프의 몸체가 반복되는 과정을 반복하는 것입니다.상태 모나드 - While- 루프
감사합니다.
/////////////////////////////////////////////////////////////////////////////////////
// Definition of the state
/////////////////////////////////////////////////////////////////////////////////////
type StateFunc<'State, 'T> = 'State -> 'T * 'State
/////////////////////////////////////////////////////////////////////////////////////
// Definition of the State monad
/////////////////////////////////////////////////////////////////////////////////////
type StateMonadBuilder<'State>() =
// M<'T> -> M<'T>
member b.ReturnFrom a : StateFunc<'State, 'T> = a
// 'T -> M<'T>
member b.Return a : StateFunc<'State, 'T> = (fun s -> a, s)
// M<'T> * ('T -> M<'U>) -> M<'U>
member b.Bind(p : StateFunc<_, 'T>, rest : 'T -> StateFunc<_,_>) : StateFunc<'State, 'U> =
(fun s ->
let a, s' = p s
rest a s')
member b.Zero() = fun s ->(), s
member b.Delay f = f
member b.Run f = f()
// Getter for the whole state, this type signature is because it passes along the state & returns the state
member b.getState : StateFunc<'State, _> = (fun s -> s, s)
// Setter for the state
member b.putState (s:'State) : StateFunc<'State, _> = (fun _ ->(), s)
// (unit -> bool) * M<'T> -> M<'T>
member b.While (cond, body: StateFunc<'State, _>): StateFunc<'State, _> =
(fun s ->
if cond() then
let bind =
let _, s' = body s
fun s' -> body s'
b.While (cond, bind) // This is wrong
else
body s)
예제 코드는 [ExtCore] (https://github.com/jack- 파파/ExtCore). 'StateBuilder' 타입의'While' 멤버에 대한 정의가 포함되어 있는지보기 위해 코드를 보셨습니까? –
굉장합니다. https://github.com/jack-pappas/ExtCore/blob/master/ExtCore/Control.fs에서 하나를 찾았습니다. 고맙습니다. – NoIdeaHowToFixThis