F#编写xuvat方程求解程序时提示xuvat未定义错误如何解决
问题原因
- 最直接的原因是函数定义顺序错误:F#采用自上而下的编译顺序,如果你将
xuvat函数写在了main入口函数的下方,编译器处理main中xuvat的调用逻辑时,还没有读取到xuvat的定义,就会抛出The value or constructor 'xuvat' is not defined的错误。 - 除此之外你的代码还有两个隐藏的编译问题:
- F#默认值类型(int、float等)不支持
null,你传入的元组(7, 0, null, null, 4)存在类型不兼容问题,就算函数定义顺序正确也无法编译。 - 你代码中使用的
**是浮点数专属的幂运算符,你当前传入的整数参数无法匹配运算符要求,运行时会报错。
- F#默认值类型(int、float等)不支持
解决方案
- 调整代码顺序,将
xuvat函数的定义放在main函数之前。 - 采用F#官方推荐的
option类型表示未知的物理量,不要使用null,所有数值统一用float类型适配运算逻辑。 - 修正分支判断逻辑,将
null判断改为option类型的IsSome判断,取值时调用.Value属性,同时补全main函数的整数退出码返回。
修正后的完整代码
let xuvat xuvatTuple = match xuvatTuple with | (x, u, v, a, t) -> match (x.IsSome, u.IsSome, v.IsSome, a.IsSome, t.IsSome) with | (true, true, true, _, _) -> let xVal = x.Value let uVal = u.Value let vVal = v.Value (Some xVal, Some uVal, Some vVal, Some ((vVal**2. - uVal**2.)/(2.*xVal)), Some ((2.*xVal)/(uVal + vVal))) | (true, true, _, true, _) -> let xVal = x.Value let uVal = u.Value let aVal = a.Value let tVal = ((sqrt (uVal**2. + (2. * aVal * xVal)) - uVal) / aVal) (Some xVal, Some uVal, Some (uVal + aVal*tVal), Some aVal, Some tVal) | (true, _, true, true, _) -> let xVal = x.Value let vVal = v.Value let aVal = a.Value let tVal = ((vVal - sqrt (vVal**2. - (2. * aVal * xVal))) / aVal) (Some xVal, Some (vVal - (aVal*tVal)), Some vVal, Some aVal, Some tVal) | (_, true, true, true, _) -> let uVal = u.Value let vVal = v.Value let aVal = a.Value let xVal = ((uVal**2. + vVal**2.)/(2.*aVal)) (Some xVal, Some uVal, Some vVal, Some aVal, Some ((vVal-uVal)/aVal)) | (_, true, true, _, true) -> let uVal = u.Value let vVal = v.Value let tVal = t.Value let xVal = ((uVal+vVal)/2.) * tVal (Some xVal, Some uVal, Some vVal, Some ((vVal-uVal)/tVal), Some tVal) | (_, true, _, true, true) -> let uVal = u.Value let aVal = a.Value let tVal = t.Value let xVal = (uVal*tVal + (aVal*tVal*tVal)/2.) (Some xVal, Some uVal, Some (uVal + aVal*tVal), Some aVal, Some tVal) | (_, _, true, true, true) -> let vVal = v.Value let aVal = a.Value let tVal = t.Value let xVal = (vVal*tVal - (aVal*tVal*tVal)/2.) (Some xVal, Some (vVal - aVal*tVal), Some vVal, Some aVal, Some tVal) | (true, _, _, true, true) -> let xVal = x.Value let aVal = a.Value let tVal = t.Value let uVal = ((xVal - aVal*tVal*tVal/2.)/tVal) let vVal = uVal + aVal * tVal (Some xVal, Some uVal, Some vVal, Some aVal, Some tVal) | (true, _, true, _, true) -> let xVal = x.Value let vVal = v.Value let tVal = t.Value let uVal = ((2.*xVal)/tVal) - vVal let aVal = ((2.*vVal*tVal - 2.*xVal)/tVal**2.) (Some xVal, Some uVal, Some vVal, Some aVal, Some tVal) | (true, true, _, _, true) -> let xVal = x.Value let uVal = u.Value let tVal = t.Value let vVal = ((2.*xVal)/tVal) - uVal let aVal = ((2.*xVal - 2.*uVal*tVal)/tVal**2.) (Some xVal, Some uVal, Some vVal, Some aVal, Some tVal) | _ -> failwith "NOT ENOUGH INFORMATION" [<EntryPoint>] let main argv = let xuvatTuple = (Some 7.0, Some 0.0, None, None, Some 4.0) let finalTuple = xuvat xuvatTuple printfn $"{finalTuple}" 0
运行上述代码会输出符合预期的计算结果:(Some 7, Some 0, Some 3.5, Some 0.875, Some 4)
内容的提问来源于stack exchange,提问作者TheKonamiKoder
相关产品推荐
相关产品推荐

