Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
If statement F#If语句需要来自浮点的单位_If Statement_F# - Fatal编程技术网

If statement F#If语句需要来自浮点的单位

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

该语句在出现最后一个elif之前是正常的,该语句随后出现错误“应具有类型单位”

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语言有一个特殊的例子:当my
then
分支的类型为
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"