在 ST Monad 中转换的函数参数
Function argument which transforms in ST Monad
我如何编写以下函数 tt
,当前存在类型错误:
t :: Int
t = runST $ do
ref <- newSTRef 10
readSTRef ref
tt :: (STRef s a -> ST s a) -> Int
tt f = runST $ do
ref <- newSTRef 10
f ref
ttTest = tt readSTRef
我认为在 tt
中的 runST
中,状态变量 s
可以线程化到函数 f
中,但是下面的编译器错误告诉我我错了:
transform.hs:50:3: Couldn't match type `s' with `s1' …
`s' is a rigid type variable bound by
the type signature for tt :: (STRef s a -> ST s a) -> Int
at transform.hs:47:7
`s1' is a rigid type variable bound by
a type expected by the context: ST s1 Int
at transform.hs:48:8
Expected type: ST s1 Int
Actual type: ST s a
Relevant bindings include
ref :: STRef s1 a
(bound at transform.hs:49:3)
f :: STRef s a -> ST s a
(bound at transform.hs:48:4)
tt :: (STRef s a -> ST s a) -> Int
(bound at transform.hs:48:1)
In a stmt of a 'do' block: f ref
In the second argument of `($)', namely
`do { ref <- newSTRef 10;
f ref }'
transform.hs:50:3: Couldn't match type `a' with `Int' …
`a' is a rigid type variable bound by
the type signature for tt :: (STRef s a -> ST s a) -> Int
at transform.hs:47:7
Expected type: ST s1 Int
Actual type: ST s a
Relevant bindings include
ref :: STRef s1 a
(bound at transform.hs:49:3)
f :: STRef s a -> ST s a
(bound at transform.hs:48:4)
tt :: (STRef s a -> ST s a) -> Int
(bound at transform.hs:48:1)
In a stmt of a 'do' block: f ref
In the second argument of `($)', namely
`do { ref <- newSTRef 10;
f ref }'
任何意见将不胜感激。
伪匿名发布答案:
tt :: (forall s . STRef s Int -> ST s Int) -> Int
.
我如何编写以下函数 tt
,当前存在类型错误:
t :: Int
t = runST $ do
ref <- newSTRef 10
readSTRef ref
tt :: (STRef s a -> ST s a) -> Int
tt f = runST $ do
ref <- newSTRef 10
f ref
ttTest = tt readSTRef
我认为在 tt
中的 runST
中,状态变量 s
可以线程化到函数 f
中,但是下面的编译器错误告诉我我错了:
transform.hs:50:3: Couldn't match type `s' with `s1' …
`s' is a rigid type variable bound by
the type signature for tt :: (STRef s a -> ST s a) -> Int
at transform.hs:47:7
`s1' is a rigid type variable bound by
a type expected by the context: ST s1 Int
at transform.hs:48:8
Expected type: ST s1 Int
Actual type: ST s a
Relevant bindings include
ref :: STRef s1 a
(bound at transform.hs:49:3)
f :: STRef s a -> ST s a
(bound at transform.hs:48:4)
tt :: (STRef s a -> ST s a) -> Int
(bound at transform.hs:48:1)
In a stmt of a 'do' block: f ref
In the second argument of `($)', namely
`do { ref <- newSTRef 10;
f ref }'
transform.hs:50:3: Couldn't match type `a' with `Int' …
`a' is a rigid type variable bound by
the type signature for tt :: (STRef s a -> ST s a) -> Int
at transform.hs:47:7
Expected type: ST s1 Int
Actual type: ST s a
Relevant bindings include
ref :: STRef s1 a
(bound at transform.hs:49:3)
f :: STRef s a -> ST s a
(bound at transform.hs:48:4)
tt :: (STRef s a -> ST s a) -> Int
(bound at transform.hs:48:1)
In a stmt of a 'do' block: f ref
In the second argument of `($)', namely
`do { ref <- newSTRef 10;
f ref }'
任何意见将不胜感激。
伪匿名发布答案:
tt :: (forall s . STRef s Int -> ST s Int) -> Int
.