这有点像镜头吗? (证明搜索变压器/组合器)

时间:2014-04-24 17:40:28

标签: haskell lens

在自动定理证明(证明搜索)中,我组成了

类型的变换器
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部分很重要,因为这些变换器做了大量工作(调用外部进程),我可能想要施加超时。

1 个答案:

答案 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)