有人可以向我解释为什么以下内容无效吗?
foo :: Int -> ST s Int
foo = return
bar :: (forall s. ST s Int) -> Int
bar = runST
baz :: Int -> Int
baz = bar . foo
为`baz:
抛出错误Couldn't match type `ST s0 Int' with `forall s. ST s Int'
Expected type: Int -> forall s. ST s Int
Actual type: Int -> ST s0 Int
我认为,由于bar
可以在其参数中接受任何 s
,因此foo
的结果( a 特别是s
)应该没问题。
编辑: 忘了添加。这按预期工作:
quux :: Int -> Int
quux x = bar $ foo x