use*_*733 7 variables haskell types unification ghc
我写了以下函数:
(.>=.) :: Num a => STRef s a -> a -> Bool
r .>=. x = runST $ do
v <- readSTRef r
return $ v >= x
Run Code Online (Sandbox Code Playgroud)
但是当我尝试编译时,我收到以下错误:
Could not deduce (s ~ s1)
from the context (Num a)
bound by the type signature for
.>=. :: Num a => STRef s a -> a -> Bool
at test.hs:(27,1)-(29,16)
`s' is a rigid type variable bound by
the type signature for .>=. :: Num a => STRef s a -> a -> Bool
at test.hs:27:1
`s1' is a rigid type variable bound by
a type expected by the context: ST s1 Bool at test.hs:27:12
Expected type: STRef s1 a
Actual type: STRef s a
In the first argument of `readSTRef', namely `r'
In a stmt of a 'do' expression: v <- readSTRef r
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
jmg*_*jmg 12
这完全符合预期.一个STRef只在一次运行中有效runST.而你试图把一个外部STRef投入到新的运行中runST.那是无效的.这将允许纯代码中的任意副作用.
所以,你尝试的是不可能实现的.按设计!
您需要保持在ST上下文中:
(.>=.) :: Ord a => STRef s a -> a -> ST s Bool
r .>=. x = do
v <- readSTRef r
return $ v >= x
Run Code Online (Sandbox Code Playgroud)
(正如hammar指出的那样,要使用>=你需要Ord类型规范,它Num不提供.)