Haskell 如何为Data.Vector编写类型签名

Haskell 如何为Data.Vector编写类型签名,haskell,types,Haskell,Types,以下代码在GHC-7.8.3上编译,但我不知道如何为f编写显式类型签名: import qualified Data.Vector.Generic.Mutable import Data.Vector.Generic (freeze, thaw, Mutable, Vector) import Control.Monad.Primitive (PrimState, PrimMonad) import Control.Monad.ST (runST, ST) f v = Data.Vector.

以下代码在GHC-7.8.3上编译,但我不知道如何为
f
编写显式类型签名:

import qualified Data.Vector.Generic.Mutable
import Data.Vector.Generic (freeze, thaw, Mutable, Vector)
import Control.Monad.Primitive (PrimState, PrimMonad)
import Control.Monad.ST (runST, ST)

f v = Data.Vector.Generic.Mutable.read v 0 >>= 
      Data.Vector.Generic.Mutable.write v 0 >> 
      return v

g :: Vector v a => v a -> v a
g v = runST $ (thaw v) >>= f >>= freeze

main = return ()
f
这里只是一个函数,它对可变向量进行一些处理并返回可变向量。我做了一个虚拟的
read
write
,只是为了将类型强制为向量

那么如何为
f
编写类型签名呢


注意:我对这个问题进行了显著的编辑,以澄清和简化它。

对于
f
来说,这种类型没有真正意义,正是因为类型族是非内射的(这正是它告诉你的)。你是说
f
接受一个
可变的v(PrimState m)a
,但这不能确定
v
实际上是什么-这就是非内射的含义。然后,输出必须取决于
v
。但是你也不知道什么是
v

在这种情况下,解决方案是显而易见的:给
f
类型
Monad m=>a->ma
。但一般来说,您必须以某种方式将类型
v
传递给函数。通常你会写

f :: (PrimMonad m, Vector v a) 
  => proxy v -> Mutable v (PrimState m) a -> m (Mutable v (PrimState m) a)
f _ =  return

推断的类型

f v = read v 0 >>= 
      write v 0 >> 
      return v

函数的参数不是类型族应用程序。这正是您应该给它的显式类型。已知类型
v
。如果你试着给它一种

(PrimMonad m, Vector v a) => Mutable v (PrimState m) a -> m (Mutable v (PrimState m) a)

像以前一样,您会得到完全相同的错误

为什么不
f::Monad m=>a->ma
?在ghci中使用
:t
命令,您将得到@András的建议。请注意,ghci 7.8.3中默认关闭了单态限制,但(IIRC)在早期版本中没有。我不明白为什么没有签名我需要传递代理,但有签名我才需要。你能看看上面更新的问题吗?
(PrimMonad m, Vector v a) => Mutable v (PrimState m) a -> m (Mutable v (PrimState m) a)