gpt4 book ai didi

if-statement - F# If 语句期望来自 float 的单位

转载 作者:行者123 更新时间:2023-12-04 05:01:03 25 4
gpt4 key购买 nike

在最后的 elif 出现错误“Was expected to have type unit”之前,语句一直正常

type BankAcc = {AccNum:int; mutable  Balance:float} with

member this.Withdraw(amount,?withdrawal) =
let withdrawAmount = this.Balance * float amount
match withdrawal with
| None -> withdrawAmount
| Some deduct -> withdrawAmount - deduct
let Account ={AccNum=123;Balance = 15.00}

Account.Withdraw(25.00) // withdrawing 25 from an account with a balance of 15

let test Balance withdrawAmount =
if Balance = withdrawAmount then "Equals"
elif Balance < withdrawAmount then "Balance too low"
else Balance - withdrawAmount

Account={AccNum =0001; Balance=0.00};

let CheckAccount Balance =
if Balance < 10.00 then "Balance is low"
elif Balance >= 10.00 && Balance <= 100.00 then "Balance is ok"
elif Balance > 100.00 then "balance is high"

let sort = Seq.unfold(fun Balance -> if(snd Balance => 50)then List.map(fun accounts-> Balance <50) list1)

最佳答案

所以让我们稍微抽象一下您的代码:

if a then b
elif x then y
elif p then q

由此,编译器可以判断当a = true时,结果应该是b。当a = false时,接下来应该检查x,如果x = true,结果应该是y .现在,如果 ax 结果都是 false,编译器知道继续检查 p,如果 p = true,则结果为 q

但是问题来了:当 abp 这三个结果都为假时,结果应该是什么?

你没有告诉编译器在那种情况下该怎么做,所以它当然会提示!


但为什么它会如此隐晦地提示呢? unit 与它有什么关系?

这与 F# 中存在的小语法放松有关,以减轻开发人员的生活。你看,因为 F# 不是函数式语言,这意味着它可以有任意的副作用,这些副作用通常不会返回任何有意义的值,比如 printf 例如:

> printf "foo"
it : unit = ()

该函数没有什么好返回的,但必须有一些返回类型,并且有一种特殊类型专门用于这种情况 - unit。它是一种只有一个值的特殊类型,因此没有任何意义。

现在让我们看看如果我需要将我的 printf 调用放在 if 中会发生什么:在任何 if 中,两个 then else 分支必须具有相同的类型,否则不清楚整个 if 表达式的类型应该是什么。因此,如果我的 then 分支包含一个 printf,我的 else 分支也必须是 unit 类型。所以我不得不总是把这个毫无意义的附录放在那里:

> if foo then printf "bar" else ()
it : unit = ()

这很烦人。事实上,令人恼火的是 F# 语言有一个特殊情况:当我的 then 分支是 unit 类型时,我可以省略 else 完全分支,编译器将假设我的意思是 else ():

> if foo then printf "bar"
it : unit = ()

这就是你的情况:因为你省略了 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"

附言修复此问题后,您将在 test 函数中遇到类似的问题:两个 then 分支是 string,但是 else 分支是 float

关于if-statement - F# If 语句期望来自 float 的单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56067957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com