2012-12-04 5 views
3

필자는 F # 모나드 (워크 플로우)에 대한 충분한 이해를 가지고 있다고 생각합니다.F # 중첩 부울 테스트에 대한 계산식?

예를 들어 여러 개의 중첩 된 if/then이있는 함수가 있습니다. 즉, 함수가 데이터가 특정 "테스트"를 통과하는 동안 계속해야합니다.

나는 "어쩌면"모나드에 익숙하지만, 내가 본 모든 예제에서 let! 바인딩에서 작동하도록 코딩되어 있습니다. 누군가가 나에게 부울 테스트에 맞게 조정 된 "어쩌면"워크 플로 예제를 제공 할 수 있기를 희망하며 let 바인딩이 아닙니다.

답변

4

a similar problem에 대한 응답으로 조건부 워크 플로우를 제안했습니다. 나는 그것을 여기 복사 할 것이다.

module Condition = 
    type ConditionBuilder() = 
    member x.Bind(v, f) = if v then f() else false 
    member x.Return(v) = v 
    let condition = ConditionBuilder() 

open Condition 

let eval() = 
    condition { 
    // do some work 
    do! conditionA 
    // do some work 
    do! conditionB 
    // do some work 
    do! conditionC 
    return true 
    } 

previous answer의 댓글에서 볼 수 있듯이 모든 팬이 아닙니다. 그럼에도 불구하고 흥미 롭습니다.

+0

+1 정말 재미 있고 F #의 놀라운 힘을 시연하는 데 도움이된다고 말한대로. 게시물을 가져 주셔서 감사합니다! –

5

새 모나드를 정의하지 않고이 문제를 해결할 수 있습니다. 그냥 당신이 지금 maybe와 함께 사용할 수있는

let test b = if b then Some() else None 

을 정의

maybe { 
    do! test (1 > 0) 
    printfn "1" 
    do! test (2 > 3) 
    printfn "2" 

    return() 
} 
3

모두 좋은 답변, 다니엘과 에이 릭합니다.

Daniels의 대답은 내가 전에 실제로 보았던 해결책으로 이끌었습니다. Tomas Petricek의 implementation of an imperative workflow. 가장 좋은 가독성을 제공하고 부울이 아닌 컨텍스트에서도 유용하기 때문에 함께하기로 결정했습니다.

감사합니다.

+0

옵션의 일반적인 개요에 관심이 있으시면 http://www.cl.cam.ac.uk/~tp322/drafts/notations.pdf와 같은 유용한 패턴이 있습니다. 샘플의 대부분은 다음과 같습니다. 여기 구현 : http://www.tryjoinads.org/computations. 나는 이것을 블로그 포스트 시리즈로도 바꾸어야한다 :-) –

관련 문제