我对coq很新,到目前为止,我只能证明我能用手工证明的事情。因此,当我遇到Selection monad并决定在haskell中实现它时,我认为这将是一个很好的练习,但我卡住了。有人可以提供一个证据的例子,选择monad是一个应用程序和monad?这是函子的haskell实现。
newtype Sel r a = Sel { runSel :: (a -> r) -> a }
instance Functor (Sel r) where
fmap ab (Sel ara) = Sel (ab . ara . (. ab))
非常感谢你们也可以证明monad法律。
编辑:以下是我的仿函数存在的证据:
Definition sel (R A : Type) := (A -> R) -> A.
Theorem functor_exists : forall (R A B : Type),
(A -> B) -> sel R A -> sel R B.
intros R A B. unfold sel. intros AB ARA BR.
apply AB. apply ARA. intro. apply BR. apply AB. exact X.
Qed.
答案 0 :(得分:3)
您不必使用策略,因为它的Coq:您可以将其用作与Haskell非常相似的编程语言。
首先,因为R
将成为本节中一直存在的变量,所以我们可以通过一劳永逸地提及它来使符号更轻松:
Section SelMon.
Variable (R : Type).
然后,我们可以复制您对sel
的定义(不包含R
变量,因为它已经在上下文中)。写fmap
作为一个很好的定义而不是使用策略的证明:
Definition sel (A : Type) := (A -> R) -> A.
Definition fmap {A B : Type} (f : A -> B) (s : sel A) : sel B :=
fun br => f (s (fun a => br (f a))).
证明您有应用的下一步是提供pure
方法。它很容易:我们可以使用常量函数。
Definition pure {A : Type} (a : A) : sel A :=
fun _ => a.
然后它变得有点毛茸茸。我建议您从join
开始,然后使用规范结构派生bind
(和app
):
Definition join {A : Type} (ssa : sel (sel A)) : sel A.
Admitted.
Definition bind {A B : Type} (sa : sel A) (asb : A -> sel B) : sel B.
Admitted.
Definition app {A B : Type} (sab : sel (A -> B)) (sa : sel A) : sel B.
Admitted.
完成上述操作后,您可以关闭该部分,R
将作为参数添加到您的所有定义中。
End SelMon.