2015-01-01 1 views
4

{경우 다른} 문장의 표현이에F # 컴파일러 오류 "이 표현식에는 유형 단위가 있어야하지만 여기에는 bool 유형이 있습니다." 나는 F #으로 이러한 기능을 작성했습니다

let TwistBasket (reverse: bool, quarters: int, overTwist: int byref) = 
    overTwist <- 50 
    WaitForBasketReady() 
    waitBasket.Reset() 
    let move = 135*quarters - 25 + overTwist 
    let speed = 
     match reverse with 
      | true -> -75y 
      | false -> 75y 
    let waitHandle = motorBasket.SpeedProfile(speed, 15u, uint32 move, 10u, true) 
    Task.Factory.StartNew(fun() -> 
     waitHandle.WaitOne() 
     if (overTwist <> 0) then 
      motorBasket.SpeedProfile(sbyte -speed, 0u, uint32 overTwist, 0u, true).WaitOne() 
     waitBasket.Set() 

if 문; This expression was expected to have type unit but here has type bool.

사실 motorBasket.SpeedProfile().WaitOne() 반환 부울 ​​문 :

if (overTwist <> 0) then 
     motorBasket.SpeedProfile(sbyte -speed, 0u, uint32 overTwist, 0u, true).WaitOne() 

가 나는 오류가 발생합니다. 나는 그것을 필요로한다.

나는 C#으로이 경우 다른 문을 변환하는 것을 시도하고 있기 때문에 :

 Task.Factory.StartNew(() => 
     { 
      waitHandle.WaitOne(); 
      if (overTwist != 0) 
      { 
       motorBasket.SpeedProfile((sbyte) -speed, 0, (uint) overTwist, 0, true).WaitOne(); 
      } 
      waitBasket.Set(); 
     }); 

가 어떻게 내 오류를 해결할 수 ?

+1

식에 |> 무시를 추가하려고 시도 했습니까? – Gustavo

+0

|> ignore를 추가해도 여전히 결과가 나옵니까? 그것은 나를 위해 매우 중요하기 때문에. – yusuf

+1

결과로 무엇을 하시겠습니까? C# 버전에서는 그냥 무시합니다. – Gustavo

답변

3

C# 버전을 살펴본 결과 아무런 결과가 없습니다. 당신의 ... 경우 다음이 경우

if (overTwist <> 0) then 
    motorBasket.SpeedProfile(sbyte -speed, 0u, uint32 overTwist, 0u, true).WaitOne() |> ignore 

F #을,이 경우에 C#을보다 엄격 더 다른이 결과 지점이 없어야합니다 : 그래서 F 번호에 나는 에게 결과를 먹을 것이다 ignore를 부를 것이다 단위, 완벽한 의미입니다.

(더미) 부울 값을 사용하여 else 분기를 만들고 let-bind (더미) 값으로 바인딩 할 수도 있지만,이 특별한 경우에는 그 값을 실제로 사용하지 않을 경우 어떤 점이 있습니까? 당신이 실제로하고있는 일은 부작용을 만들고 결과를 무시하는 것입니다. F #은 코드에서 더 명확하게 만듭니다.

2

F # if/else의 표현식은 같은 유형이어야합니다. else 분기가없는 if 표현식을 사용하는 경우 F # 컴파일러는 암시 적으로 else 분기 유형이 unit이므로 오류를 고려해야합니다. 명시 적으로 다른 지점 사용하도록 코드를 변경할 수 :

if (overTwist <> 0) then 
    motorBasket.SpeedProfile(sbyte -speed, 0u, uint32 overTwist, 0u, true).WaitOne() 
else 
    ... // Put here expression of the same type as if (I assume it's bool) 

을 아니면 분기가 구스타보가 언급 한 경우에 ignore 기능을 사용할 수 있습니다.

+0

실제로 다른 분기를 추가해도 문제가 해결되지는 않습니다. 'if .. then .. else .. '표현식을 let-bind 값에 할당해야합니다. 그 값이 사용되지 않는다면'let _ = if .. then else ..'.. 할 수 있습니다. 어쨌든이 표현식을'ignore'에 보내는 것이 더 나을 것입니다. 그러나 else를 필요로하지 않습니다. ;) – Gustavo