当我尝试编译时:
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的可变 vector 中读取吗?如果是这样,怎么办?我以为它需要
myRead
的类型签名,但是我尝试过的一切只会导致越来越多的无法理解的错误消息。编辑:突出显示一些上下文,我在下面的注释中添加了该上下文:这里的上下文是我有一个函数,该函数接收一个可变 vector ,使用该可变 vector 作为临时暂存空间进行一些计算,然后需要返回浮点数值。因为我不在乎可变 vector 的更改,所以我想知道是否有一种方法可以忽略其“状态更改”,而仅从其内部返回一个值。
最佳答案
其他答案很好,但我认为您缺少关于ST的一件事。每次对runST的调用都会有效地创建一个新的“ST Universe”,在其中运行一些命令性代码。因此,如果您一次调用runST来创建数组,而又一次调用runST来从该数组中获取一个值,那么事情就不可能正常进行。这两个runST调用需要它们自己唯一的Universe,而您希望它们共享一个。
答案详细解释的是某些类型系统的诡计如何创建这些独特的Universe。
关于haskell - Haskell:runST的“Could not deduce”错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11801811/