这里有一个func13,它应该将元组中的Ints数组转换为元组中的双倍,但是没有,我也不知道为什么。
func13 :: Data.Massiv.Core.Array U Ix1 (Double,Double,Double,Double)
func13 = runST (do tarr <- func12
Data.Massiv.Array.Mutable.forPrimM tarr (pure . (\x -> (( (realToFrac (sel1 x)) / 100 ), ((realToFrac (sel2 x)) / 100), ((realToFrac (sel3 x)) / 100), ((realToFrac (sel4 x)) / 100 )) ))
Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr)Func12的类型是由编译器确认的ST s (Data.Massiv.Array.Mutable.MArray (PrimState (ST s)) U Ix1 (Int,Int,Int,Int))。
函数forPrimM在可变数组上映射函数(e,->,m)。
这是我得到的编译器错误。
• Couldn't match type ‘Int’ with ‘Double’
Expected type: ST s (Array U Ix1 (Double, Double, Double, Double))
Actual type: ST s (Array U Ix1 (Int, Int, Int, Int))
• In a stmt of a 'do' block:
Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr
In the first argument of ‘runST’, namely
‘(do tarr <- func12
forPrimM
tarr
(pure
. (\ x
-> (((realToFrac (sel1 x)) / 100), ((realToFrac (sel2 x)) / 100),
((realToFrac (sel3 x)) / 100), ((realToFrac (sel4 x)) / 100))))
Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr)’
In the expression:
runST
(do tarr <- func12
forPrimM
tarr
(pure
. (\ x
-> (((realToFrac (sel1 x)) / 100), ((realToFrac (sel2 x)) / 100),
((realToFrac (sel3 x)) / 100), ((realToFrac (sel4 x)) / 100))))
Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr)
|161 % Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
有人能帮我弄清楚为什么会发生这种事吗?
发布于 2021-08-19 07:43:17
函数
forPrimM在可变数组上映射函数(e -> m e)。
你就在那儿。您在数组上映射的函数必须保持类型。那是因为更新发生在原地。
理论上,我认为可以重用Int数组的存储来存储Double值,但这不是我会尝试的东西,除非作为最后的优化。在您的例子中,我怀疑修改func12是一个更好的主意,这样它就可以自己生成Double值,也许您可以将它变成参数化的(Unbox n, Num n)?
https://stackoverflow.com/questions/68842153
复制相似问题