当我尝试编译此:哈斯克尔:“无法演绎”错误与runST
module Main where
import qualified Data.Vector.Unboxed.Mutable as MV
import Control.Monad.ST
myRead mv = runST $ MV.read mv 0
我收到以下错误信息:
Could not deduce (t ~ U.MVector s a)
from the context (U.Unbox a)
bound by the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1-32
`t' is a rigid type variable bound by
the inferred type of myRead :: U.Unbox a => t -> a
at src/Main.hs:53:1
Expected type: U.MVector (PrimState (ST s)) a
Actual type: t
In the first argument of `MV.read', namely `mv'
In the second argument of `($)', namely `MV.read mv 0'
In the expression: runST $ MV.read mv 0
我可以读取从一个可变矢量纯粹与runST?如果是这样,怎么样?我认为它需要myRead
的类型签名,但我尝试过的所有内容都会导致越来越多的不可理解的错误消息。
编辑:他强调了一点,我只是把一个评论如下:这里的背景是,我有一个函数,它在一个可变矢量,使用可变矢量作为临时空间,然后需要做一些计算返回一个浮点值。因为我不关心可变向量的变化,所以我想知道是否有办法忽略它的“状态变化”,并简单地从其中返回一个值。
我认为智者Breitner和Fischer的观点是,我们需要更多地了解你如何达到这一点。什么函数产生你建议应用myRead的可变向量?请参阅Breitner回复中的最后一句。如果我们知道是什么让你在这个角落里,我们可以说如何重新分析东西,让它们一起挂。因此,更多的代码行将会有所帮助。例如,如果'mv'在ST块内,则可以使用更简单的定义'myRead mv = MV.read mv 0'(no'runST')。 – applicative 2012-08-03 20:12:38
让我强化一下应用说:我们需要更多的上下文。不知道你实际想要达到什么目标,我们找不到合适的解决方案。 – 2012-08-03 21:40:45