F#报错FS0039:Assert类函数参数未定义的问题咨询
F# 断言类报错 FS0039 的解决方法
核心问题分析
你遇到的FS0039: 值或构造函数未定义错误,根源在于**Assert类的静态成员无法访问实例构造参数**:
- 你把
str、a、b、f定义为类的实例构造参数,但test是静态成员——静态成员属于类本身,不能访问实例级别的参数,编译器找不到这些变量,因此报错。 - 此外代码还存在逻辑错误(无论断言结果如何都输出"Pass")、
addGas方法逻辑错误、未定义InsuficientGas异常等问题。
修正后的完整代码
1. 先定义缺失的异常
exception InsuficientGas of string
2. 修正car类(修复油箱初始化、加油逻辑)
type car (fuelEco: float, initialFuel:int) = let mutable fuelEco = fuelEco let mutable tank = initialFuel // 用构造参数初始化油箱,而非固定为0 member this.addGas (liter: int) = tank <- tank + liter // 改为累加汽油,而非直接覆盖 member this.gasLeft () = tank member this.drive (km: int) = let requiredGas = float(km) / fuelEco if float(tank) < requiredGas then raise (InsuficientGas "You can't drive this far - you have insufficient amount of gas") else tank <- tank - int(requiredGas)
3. 重构Assert类(改为静态方法)
将test改为静态方法,直接接收参数,避免依赖实例构造:
type Assert = static member test (str: string, a:int, b: float, f:(int -> int -> bool)) = let convertedB = int b if f a convertedB then printfn "Pass : %s" str else printfn "Fail : %s" str
4. 测试代码
let fe = 18.3 let mini = car(fe, 0) // F#中可省略new关键字 Assert.test ("GasLeft () - Full?", mini.gasLeft(), 10.0, (=)) Assert.test ("GasLeft () - Empty?", mini.gasLeft(), 0.0, (=))
预期输出
Fail : GasLeft () - Full? Pass : GasLeft () - Empty?
内容的提问来源于stack exchange,提问作者morten
相关产品推荐
相关产品推荐

