调用realToFrac仍报Int类型错误 Massiv数组元组Int转Double问题
错误原因
forPrimM的映射函数签名为e -> m e,要求输入输出元素类型完全一致,仅支持同类型数组的原地修改,无法改变数组的元素类型。- 你从
func12获取的可变数组tarr固定为(Int,Int,Int,Int)类型,即使传入返回Double四元组的映射函数,也无法改变原数组的类型约束,最终unsafeFreeze得到的仍为Int四元组数组,与func13声明的Double四元组返回类型不匹配,因此触发编译错误。
修复方案
- 推荐方案:先冻结得到不可变Int数组,再映射转换为Double类型后计算得到目标数组,代码示例:
func13 :: Data.Massiv.Core.Array U Ix1 (Double,Double,Double,Double) func13 = runST $ do tarr <- func12 intArr <- Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr pure $ compute $ fmap (\x -> ( realToFrac (sel1 x) / 100 , realToFrac (sel2 x) / 100 , realToFrac (sel3 x) / 100 , realToFrac (sel4 x) / 100 )) intArr
- 可选方案:新建对应长度的Double类型可变数组,将转换后的元素逐个写入新数组,再冻结新数组返回,适合需要手动控制内存操作的场景。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

