首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Agda商店Comonad

Agda商店Comonad
EN

Stack Overflow用户
提问于 2020-10-06 04:01:31
回答 2查看 168关注 0票数 1

我刚刚从Agda开始,但是我知道一些Haskell,并且想知道如何定义Agda中的Store。

这是我到现在为止拥有的:

代码语言:javascript
复制
   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

现在,我得到了以下错误:

代码语言:javascript
复制
Parse error
=<ERROR>
 extract s a
  ; extend f (Sto...

我不太确定我做错了什么。任何帮助都将不胜感激!谢谢!

编辑

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

代码语言:javascript
复制
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,有签名

代码语言:javascript
复制
record RawComonad (W : Set f → Set f) : Set (suc f)

Store是基于哈斯克尔的type Store s a = (s -> a, s)

现在我遇到的错误是:

代码语言:javascript
复制
(a : Set) → Σ (Set → Set) (λ x → Set) !=< Set
when checking that the expression λ a → Store s a has type Set

我想知道这个错误是否与这一行有关:

代码语言:javascript
复制
StoreComonad : RawComonad (λ s a → (Store s a))

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-07 03:50:53

您的问题是,λ s a → (Store s a) (或者,eta-contracted,Store)不是一个共通;它的类型(或者,对于您的Haskell直觉来说,我们可以说是它的类型)是不正确的。

但是,对于s的任何选择,Store s都是!所以让我们写:

代码语言:javascript
复制
StoreComonad : ∀ {s : Set} → RawComonad (Store s)

StoreComonad的其他定义将很容易遵循。

顺便说一下,您可以通过使用StoreComonad而不是使用显式投影来使模式匹配羔羊的定义更好(请阅读该链接,因为您似乎混淆了普通的lambda和模式匹配的);例如:

代码语言:javascript
复制
  extract   = λ { (f , a) → f a }

诸若此类。

票数 2
EN

Stack Overflow用户

发布于 2020-10-07 03:05:04

哇,好吧,我想沉默是我需要的答案。我在定义Store方面取得了相当大的进步:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64219170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档