当我尝试编译时:

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/

10-11 07:32