首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管在编译器引用的值上使用realToFrac,但仍获得类型错误输出输入

尽管在编译器引用的值上使用realToFrac,但仍获得类型错误输出输入
EN

Stack Overflow用户
提问于 2021-08-19 04:43:39
回答 1查看 45关注 0票数 0

这里有一个func13,它应该将元组中的Ints数组转换为元组中的双倍,但是没有,我也不知道为什么。

代码语言:javascript
复制
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)。

这是我得到的编译器错误。

代码语言:javascript
复制
    • 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)

| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

有人能帮我弄清楚为什么会发生这种事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-19 07:43:17

函数forPrimM在可变数组上映射函数(e -> m e)

你就在那儿。您在数组上映射的函数必须保持类型。那是因为更新发生在原地。

理论上,我认为可以重用Int数组的存储来存储Double值,但这不是我会尝试的东西,除非作为最后的优化。在您的例子中,我怀疑修改func12是一个更好的主意,这样它就可以自己生成Double值,也许您可以将它变成参数化的(Unbox n, Num n)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68842153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档