에서 상태 및 연속 모나드를 결합하는 방법 트리가 특정 깊이까지 트래버스 될 때까지 하위 작업이 생성되는 작업 병렬 라이브러리를 사용하여 트리를 합산하려고합니다. 그렇지 않으면 나머지 자식 노드를 합계하여 합계합니다 스택 오버 플로우를 피하기 위해 연속 전달 스타일.F #
그러나 코드는 꽤 못생긴 것처럼 보입니다. 현재의 깊이를 전달하기 위해 상태 모나드를 사용하는 것이 좋지만 상태 모나드는 꼬리 재귀가 아닙니다. 양자 택일로, 나는 어떻게 계속 모나드를 수정하여 주를 떠날 수 있습니까? 또는 주와 연속 모나드의 조합을 만들 수 있습니까?
let sumTreeParallelDepthCont tree cont =
let rec sumRec tree depth cont =
let newDepth = depth - 1
match tree with
| Leaf(num) -> cont num
| Branch(left, right) ->
if depth <= 0 then
sumTreeContMonad left (fun leftM ->
sumTreeContMonad right (fun rightM ->
cont (leftM + rightM)))
else
let leftTask = Task.Factory.StartNew(fun() ->
let leftResult = ref 0
sumRec left newDepth (fun leftM ->
leftResult := leftM)
!leftResult
)
let rightTask = Task.Factory.StartNew(fun() ->
let rightResult = ref 0
sumRec right newDepth (fun rightM ->
rightResult := rightM)
!rightResult
)
cont (leftTask.Result + rightTask.Result)
sumRec tree 4 cont // 4 levels deep
나는이 블로그 게시물에 좀 더 자세하게있어 : 내 눈에서 http://taumuon-jabuka.blogspot.co.uk/2012/06/more-playing-with-monads.html
이것은 이상한 조합입니다. 당신은 성능을 위해 병렬 처리를하고 있지만, 매우 비효율적 인 연속성 전달 스타일을 사용하고 있습니다. –