在自动定理证明(证明搜索)中,我组成了
类型的变换器t :: Claim -> IO (Maybe (Claim, Proof -> Proof))
这样:当t c
返回Just (c', f)
时,c'
隐含c
,并且c
的证据来自证明p'
通过计算c'
获得f p'
。
这是一个镜头,不知何故? (如果是的话,它会有什么帮助?)
还有一个更普遍的情况(对于几个或零个子目标)
ts :: Claim -> IO (Maybe ([Claim], [Proof] -> Proof))
IO
部分很重要,因为这些变换器做了大量工作(调用外部进程),我可能想要施加超时。
答案 0 :(得分:3)
我无法轻易看到镜头如何帮助解决这个问题。但是,重新排序你的monadic堆栈并使用monad变换器应该使组合变得更容易,并且在你不需要杂质的情况下也可以从IO
中抽象出来:
t' :: Claim -> MaybeT IO (Claim, Proof -> Proof)
如果您希望或需要继续使用t
的现有实施,尽管类型较为繁琐,您可以使用以下结果将结果提升至MaybeT
:
(MaybeT . return =<<) . lift :: m (Maybe b) -> MaybeT m b
值得注意的是,Claim -> (Claim, Proof -> Proof)
相当于State Claim (Proof -> Proof)
,因此可能会更进一步:
t'' :: StateT Claim (MaybeT IO) (Proof -> Proof)