我有一個func13,它應該把一個元組中的Ints陣列轉換為一個元組中的Doubles陣列。 但卻沒有,我不知道為什么。
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 e)。
這是我得到的編譯器錯誤
- Couldn't匹配 type 'Int' with 'Double'。
Expected type: ST s (Array U Ix1 (Double, Double, Double, Double)
實際 型別。ST s (Array U Ix1 (Int, Int, Int, Int)
- In a stmt of a 'do' block:
Data.Massiv.Array.Unsafe.unsafeFreeze Par tarr
在第一個引數的'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)'
在運算式。
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)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
誰能幫我弄清楚為什么會出現這種情況呢?
uj5u.com熱心網友回復:
函式
forPrimM在一個可變陣列上映射一個函式(e -> m e)。
你說的很對。你在陣列上映射的函式必須是型別保護的。這是因為更新是在原地進行的。
理論上我認為有可能重新使用Int陣列的存盤來存盤Double值,但是除了作為最后的優化手段,我不會嘗試這樣做。在你的案例中,我認為修改func12是一個更好的主意,所以它可以自己生成Double值,也許你可以讓它成為(Unbox n, Num n)引數?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/316981.html
標籤:
