阿格达Agda商店Comonad

问题描述

我只是从Agda开始,但是了解一些Haskell,并且想知道如何在Agda中定义商店Comonad。

这是我到目前为止所拥有的:

   open import Category.Comonad
   open import Data.Product

   Store : Set → Set → ((Set → Set) × Set)
   Store s a = ((λ s → a),s)

   StoreComonad : RawComonad (λ s a → (Store s a))
   StoreComonad = record
     { extract (Store s a) = extract s a
     ; extend f (Store s a = Store (extend (λ s' a' →­ f (Store s' a')) s) a
     } where open RawComonad

目前,我遇到以下错误

Parse error
=<ERROR>
 extract s a
  ; extend f (Sto...

我不太确定自己在做什么错。任何帮助,将不胜感激!谢谢!

编辑

我想我越来越近了。我使用匹配的lambda替换了记录中的字段:

Store : Set → Set → ((Set → Set) × Set)
Store s a = ((λ s → a),s)

StoreComonad : RawComonad (λ s a → (Store s a))
StoreComonad = record
  { extract   = λ st → (proj₁ st) (proj₂ st)
  ; duplicate = λ st → Store (λ s → Store (proj₁ st) s) (proj₂ st)
  ; extend    = λ g st → g (duplicate st)
  } where open RawComonad

RawComonad来自https://github.com/agda/agda-stdlib/blob/master/src/Category/Comonad.agda 并有签名

record RawComonad (W : Set f → Set f) : Set (suc f)

Store基于Haskell中的type Store s a = (s -> a,s)

现在我得到的错误是:

(a : Set) → Σ (Set → Set) (λ x → Set) !=< Set
when checking that the expression λ a → Store s a has type Set

我想知道此错误是否与以下行有关:

StoreComonad : RawComonad (λ s a → (Store s a))

我发现Agda中的编译错误消息没有提供很多线索,或者我还不能很好地理解它们。

解决方法

您的问题是λ s a → (Store s a)(或者,按照eta合同约定,Store)不是普通的;它的类型(或者,对于您的Haskell直觉,我们可以说它的类型)不正确。

但是,对于s 的任何选择,Store s都是!因此,让我们这样写:

StoreComonad : ∀ {s : Set} → RawComonad (Store s)

StoreComonad的其余定义将很容易理解。

顺便说一句,您可以使用pattern-matching lambdas而不是使用明确的投影来使StoreComonad的定义更好(并且请务必阅读该链接,因为您似乎将普通的lambda与pattern-混合使用了-匹配的);例如:

  extract   = λ { (f,a) → f a }

以此类推。

,

哇,好吧,我认为沉默是我需要的答案。我在定义Store Comonad方面做了很多努力:

S : Set
S = ℕ

Store : Set → Set
Store A = ((S → A) × S)

pos : ∀ {A : Set} → Store A → S
pos = λ st → proj₂ st

peek : ∀ {A : Set} → S → Store A → A
peek = λ s → λ st → (proj₁ st) s

fmap : ∀ {A : Set} {B : Set} → (A → B) → Store A → Store B
fmap = λ f → λ st → ((f ∘ proj₁ st),proj₂ st)

duplicate' : ∀ {A : Set} → (Store A) → Store (Store A)
duplicate' = λ st → (λ s' → proj₁ st,s'),proj₂ st

StoreComonad : RawComonad Store
StoreComonad = record
  { extract = λ st → (proj₁ st) (proj₂ st)
  ; extend  = λ g st → fmap g (duplicate' st)
  } where open RawComonad

在我了解到C-c-C-lC-c-C-r?的过程中,对查找填充?所需的类型很有帮助。我以前使用?来证明一些示例,但没有尝试使用它来查找如何编写类型。

还剩下什么..我想制作S而不只是Nat