使用MathNet.Numerics Fit.Line时F#元组类型不匹配错误求助
解决MathNet.Numerics中Fit.Line结构元组与F#引用元组的类型不匹配问题
编译错误“One tuple type is a struct tuple, the other is a reference tuple”的核心原因是:Fit.Line返回的是结构元组(float * float),而F#默认的解构语法针对的是引用元组(float, float),二者属于不同类型,无法直接兼容。
正确解决方法
有两种简洁的方式可以解决这个类型不匹配问题:
方法1:显式解构结构元组
在解构时添加struct关键字,明确告诉编译器要处理的是结构元组:
let struct(Tau0, Mu) = results
方法2:手动转换为引用元组
直接提取结构元组的Item1和Item2属性,组装成引用元组后再解构:
let Tau0, Mu = (results.Item1, results.Item2)
修改后的完整代码
以下是使用方法1的完整可编译代码:
open MathNet.Numerics open MathNet.Numerics.Optimization open MathNet.Numerics.LinearAlgebra let BinghamModel (tau0: float) (mu: float) (shearRate: float) = tau0 + mu * shearRate let GetBinghamModelFit (shearRate: float[]) (shearStress: float[]) = let results = Fit.Line(shearRate, shearStress) // 显式解构结构元组 let struct(Tau0, Mu) = results let shearStressCalculated = Array.map (BinghamModel Tau0 Mu) shearRate let RSquared = GoodnessOfFit.RSquared(shearStressCalculated, shearStress) (Tau0, Mu, RSquared)
为什么之前的尝试无效
ref(results):创建的是引用单元格(float * float ref),并非转换元组类型,与解构语法不兼容;struct(results):该语法用于将引用元组转换为结构元组,但results本身已是结构元组,因此无意义;box results :?> float * float:结构元组和引用元组是完全不同的类型,装箱后无法强制转换,运行时会抛出类型转换异常。
内容的提问来源于stack exchange,提问作者Maamar Dliouah
相关产品推荐
相关产品推荐

