F# doTransfer异步函数报错:if表达式需为unit类型当前为bool
错误原因
F# 语法要求:无else分支的if表达式必须返回unit类型,因为条件不命中时该表达式无输出值,只能对应无返回值的操作。你在then分支使用return false属于async计算表达式的返回控制语句,导致整个if表达式的类型不符合unit要求,因此触发类型校验错误。
解决方法
给每个单分支if补充else ()即可,()是F#中的unit类型值,补充后符合语法要求,也不影响你提前终止函数返回false的逻辑。
如果要更符合F#编码习惯,也可以把xx = false简化为not xx判断。
注:原代码中
doTransfer函数内后续异步调用重复写了clickTransferTab属于笔误,实际使用时可替换为对应业务函数即可。
修正后的完整代码
let clickTransferTab (page: IPage, dataId: string) = async { try // Click Transfer tab let! selector = Async.AwaitTask(page.WaitForSelectorAsync("div[data-id='"+dataId+"'] a.t3")) do! Async.AwaitTask(selector.ClickAsync()) return true with ex -> return false } let doTransfer (page: IPage, dataId: string, transferAmount: string, bankAccountText: string) = async { try let! clickTransferResult = clickTransferTab(page,dataId) if not clickTransferResult then return false else () let! selectBankresult = clickTransferTab(page,dataId) if not selectBankresult then return false else () let! enterTransferResult = clickTransferTab(page,dataId) if not enterTransferResult then return false else () let! reconcilResult = clickTransferTab(page,dataId) if not reconcilResult then return false else () return true with ex -> return false }
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

