对于某些具体的foo :: (forall s . ST s a) -> b
和a
,我有一个ST提取器b
。我可以安全地创建另一个函数fooC :: (forall s . ST s (a, c)) -> (b, c)
,这将允许我从ST计算中返回一些额外的值吗?是否可以安全使用通用转换addC :: ((forall s . ST s a) -> b) -> (forall s1 . ST s1 (a,c)) -> (b,c)
?
答案 0 :(得分:3)
我不确定我是否理解您要完成的任务,但这种类型正确:
addC :: ((forall s . ST s a) -> b)
-> (forall s1 . ST s1 (a,c)) -> (b,c)
addC f m = runST $ (\(a,c) -> (f (pure a), c)) <$> m
请注意,(forall s. ST s a)
与a
同构(由pure
和runST
见证),所以也许您应该只使用函数a -> b
和价值(a, c)
。