F# F“编译器错误”;此表达式应具有类型unit,但此处具有类型bool。”;{if else}语句中的表达式

F# F“编译器错误”;此表达式应具有类型unit,但此处具有类型bool。”;{if else}语句中的表达式,f#,c#-to-f#,unit-type,F#,C# To F#,Unit Type,我用F#写了这样一个函数: let-TwistBasket(反向:bool,四分之一:int,反向:int-byref)= 超扭转-75y |假->75y 让waitHandle=motorBasket.SpeedProfile(速度,15u,uint32移动,10u,真) Task.Factory.StartNew(乐趣()-> waitHandle.WaitOne() 如果(过度扭曲0),则 motorBasket.SpeedProfile(sbyte-speed,0u,uint32 ove

我用F#写了这样一个函数:

let-TwistBasket(反向:bool,四分之一:int,反向:int-byref)=
超扭转-75y
|假->75y
让waitHandle=motorBasket.SpeedProfile(速度,15u,uint32移动,10u,真)
Task.Factory.StartNew(乐趣()->
waitHandle.WaitOne()
如果(过度扭曲0),则
motorBasket.SpeedProfile(sbyte-speed,0u,uint32 overTwist,0u,true).WaitOne()
waitBasket.Set()
关于本if声明

如果(过度扭曲0)则
motorBasket.SpeedProfile(sbyte-speed,0u,uint32 overTwist,0u,true).WaitOne()
我得到一个错误:
这个表达式应该有unit类型,但这里有bool类型。

实际上
motorBasket.SpeedProfile().WaitOne()
返回布尔语句。我需要它

因为我试图转换C#中的if-else语句:

Task.Factory.StartNew(()=>
{
waitHandle.WaitOne();
如果(过度扭曲!=0)
{
motorBasket.SpeedProfile((sbyte)-速度,0,(uint)过度扭曲,0,true.WaitOne();
}
waitBasket.Set();
});
如何修复我的错误?

通过查看C版本,它对结果没有任何影响。因此在F中,我将调用
ignore
,它将吃掉结果:

if (overTwist <> 0) then
     motorBasket.SpeedProfile(sbyte -speed, 0u, uint32 overTwist, 0u, true).WaitOne() |> ignore
如果(过度扭曲0)则
motorBasket.SpeedProfile(sbyte-speed,0u,uint32 overTwist,0u,true)。WaitOne()|>忽略
在这些情况下,如果你的if..then没有其他分支,那么结果应该是unit,这很有意义

您还可以使用(虚拟)布尔值创建else分支,并将其绑定到(虚拟)值,但在这种特殊情况下,如果您真的不打算使用该值,那有什么意义呢?您真正做的是创建一个副作用并忽略结果,F#会促使您在代码中更加明确。

在F#
中,if/else
表达式应该具有相同的类型。如果您将
if
表达式与FAX编译器认为隐式<代码>其他< /代码>分支有类型<代码>单元< /代码>因此出错。 您可以更改代码以显式使用else分支:

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)
如果(过度扭曲0)则
motorBasket.SpeedProfile(sbyte-speed,0u,uint32 overTwist,0u,true).WaitOne()
其他的
…//将相同类型的表达式放在这里,就像(我假设它是bool)

或者你可以像Gustavo提到的那样在if分支中使用
ignore
函数。

你有没有尝试在表达式中添加|>ignore?如果我添加|>ignore,我仍然调用get结果?因为这对我来说非常重要。你想对结果做什么?在C版本中,它只是忽略它。谢谢你的帮助Gustavo。但实际上我很抱歉我们将再次遇到类似的问题,在接下来的声明中,Petr的方法可能会更有用。不用担心。原则上我会坚持C版本,然后一旦完成工作翻译,我可能会重构。你的选择!实际上,添加一个else分支并不能单独解决问题。你需要分配
if..then..else..
表达式与let绑定值。如果未使用该值,则可以执行
let..=if..then..else..
。无论如何,在这种情况下,最好将表达式发送到
忽略
,但不需要else;)