我刚从 Agda 开始,但了解一些 Haskell,并想知道如何在 Agda 中定义 Store 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
基于type Store s a = (s -> a, s)
Haskell。
现在我得到的错误是:
(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 中的编译错误消息并没有给出太多线索,或者我还没有能够很好地理解它们。