If statement F#If语句需要来自浮点的单位
该语句在出现最后一个elif之前是正常的,该语句随后出现错误“应具有类型单位”If statement F#If语句需要来自浮点的单位,if-statement,f#,If Statement,F#,该语句在出现最后一个elif之前是正常的,该语句随后出现错误“应具有类型单位” type BankAcc={AccNum:int;可变余额:float} 成员本次提款(金额,?提款)= 取款金额=此。余额*浮动金额 匹配退出 |无->提取金额 |部分扣除->提取金额-扣除 let Account={AccNum=123;余额=15.00} 账户.提款(25.00)//从余额为15的账户中提款25 让测试平衡取款金额= 如果余额=提款金额,则“等于” elif余额=10.00&&Balance 1
type BankAcc={AccNum:int;可变余额:float}
成员本次提款(金额,?提款)=
取款金额=此。余额*浮动金额
匹配退出
|无->提取金额
|部分扣除->提取金额-扣除
let Account={AccNum=123;余额=15.00}
账户.提款(25.00)//从余额为15的账户中提款25
让测试平衡取款金额=
如果余额=提款金额,则“等于”
elif余额<提取金额,然后“余额过低”
其他余额-提款金额
账户={AccNum=0001;余额=0.00};
让支票账户余额=
如果余额小于10.00,则“余额低”
如果余额>=10.00&&Balance 100.00,则“余额较高”
让sort=Seq.unfold(乐趣平衡->如果(snd平衡=>50))然后List.map(乐趣账户->平衡),让我们稍微抽象一下代码:
if a then b
elif x then y
elif p then q
由此,编译器可以判断当a=true
时,结果应该是b
。当a=false
时,它接下来应该检查x
,如果x=true
,结果应该是y
。现在,如果a
和x
结果都是false
,编译器知道要继续d检查p
,如果p=true
,则结果为q
但问题是:当所有三个,a
、b
和p
都被证明是假的时候,结果会是什么
您还没有告诉编译器在这种情况下该怎么做,所以它当然会抱怨
但为什么它会如此隐晦地抱怨呢?unit
和它有什么关系
这与F#中存在的一个小的语法放松有关,以简化开发人员的生活。你看,因为F#不是一种纯粹的函数式语言,这意味着它可能有任意的副作用,这些副作用通常不会返回任何有意义的值,例如printf
:
> printf "foo"
it : unit = ()
函数没有任何好的返回,但是必须有一些返回类型,并且有一种特殊类型仅适用于这种情况-单元
。它是一种只有一个值的特殊类型,因此它没有任何意义
现在让我们看看如果我需要将我的printf
调用放入if
中会发生什么:在任何if
中,then
和else
分支必须具有相同的类型,否则不清楚整个if
表达式的类型应该是什么。因此,如果我的那么分支包含一个printf
,我的else分支也必须是unit
类型。因此,我不得不始终将这个毫无意义的附录放在那里:
> if foo then printf "bar" else ()
it : unit = ()
这很烦人。事实上,非常烦人的是F语言有一个特殊的例子:当mythen
分支的类型为unit
时,我可以完全省略else
分支,编译器会假设我的意思是说else()
:
因此,在您的情况下就是这样:由于您省略了else
分支,编译器假定所有then
分支都必须是unit
类型,但它们显然是float
类型,因此编译器会抱怨
要解决此问题,您需要提供一个else
分支。根据您的代码判断,您似乎真的考虑到了以下可能的情况:(1)小于10,(2)介于10和100之间,以及(3)其他所有情况。如果是这样,“其他所有情况”分支应该是else
:
if Balance < 10.00 then "Balance is low"
elif Balance >= 10.00 && Balance <= 100.00 then "Balance is ok"
else "balance is high"
如果余额<10.00,则“余额低”
elif Balance>=10.00&&Balance最后的elif
应该是else
;当前您有一个if
而没有else
,这是不允许的,除非if
分支返回unit
。
> if foo then printf "bar"
it : unit = ()
if Balance < 10.00 then "Balance is low"
elif Balance >= 10.00 && Balance <= 100.00 then "Balance is ok"
else "balance is high"