2016-07-13 6 views
2

계산식 작동 방법에 대해 자세히 알아 내려고 if 문의 then 블록을 계산 한 후 나머지 표현식을 건너 뛰는 작성기를 코딩하려고 시도하면 워크 플로 자체가 true으로 계산됩니다. true으로 계산 된 문이 if 인 경우 워크 플로에서 false을 반환해야합니다. 예를 들어F # "exit early"계산식?

:

여기
let mutable x = 0 

let result = 
    earlyExit { 
     if false then x <- 99 
     if true then x <- 33 
     if true then x <- 11 
    } 

, resulttrue이어야하며 x33이어야한다.

내가 들어 왔 가장 가까운

은 다음과 같습니다

type EarlyExitBuilder() = 
    member this.Combine (a, b) = a || b() 
    member this.Delay fn = fn 
    member this.Run fn = fn() 
    member this.Zero() = false 
false로 평가 워크 플로우 결과

... 및 11-x.

이 예제는 내 예제의 구문을 사용합니까?

+0

관련 항목 : http://stackoverflow.com/questions/13710700/f-computation-expression-for-nested-boolean-tests – bytebuster

답변

2

당신에게 당신이 찾고있는 행동을 줄 것이다 가장 작은 변화는 계산에 return을 추가 아마도합니다 - return 구조가 초기 평가 true을 반환하고 종료 할 수 있습니다 :

let mutable x = 0 

let result = 
    earlyExit { 
     if false then return x <- 99 
     if true then return x <- 33 
     if true then return x <- 11 
    } 

true로 평가를 x의 값은 33이됩니다. 계산 빌더 추가 Return 회원이 true를 반환과 함께, 당신과 동일합니다 :

참조 된 답변 중 하나에서 언급 한 바와 같이
type EarlyExitBuilder() = 
    member this.Combine (a, b) = a || b() 
    member this.Delay fn = fn 
    member this.Run fn = fn() 
    member this.Zero() = false 
    member this.Return(()) = true 

, 이것은 당신이 필수적 스타일 returnextended version with break and continue을 사용할 수있는 내 imperative computation builder 다소 관련이 .

+0

우수, 고맙습니다, 토마스! 당신은 항상 F # 애호가를 낳는 우리를 위해 왔습니다. :) 솔루션을 실현하는 데 거의 가까웠다는 것을 알게되었습니다. – MiloDC

+1

@MiloDC 재미있는 질문이었습니다 :) 계산 표현식은 예기치 않은 놀라움을 항상 숨 깁니다 (심지어 나를 위해!) –

3

내가 제안하는 구문을 사용하여 이것을 수행하는 좋은 방법이 없다고 생각합니다. 계산 식의 내부에 뭔가

처럼
if c then e 

그렇게 촬영 한 가지 차별화 할 수있는 상황에 대한 방법이 없습니다

if c then 
    e 
    builder.Zero() 
else 
    builder.Zero() 

같은 것을 컴파일받을 것입니다.