Haskell 如何为Data.Vector编写类型签名
以下代码在GHC-7.8.3上编译,但我不知道如何为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.
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)