-
Notifications
You must be signed in to change notification settings - Fork 239
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add new module Effect.Functor.Naperian
#2004
base: master
Are you sure you want to change the base?
Changes from all commits
1a86ef4
0dd5051
af6d2dc
eba481c
603483f
7dcb115
d76c8df
73bd5bd
e233f0e
ad30c67
775560f
6804ecd
a1de89f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
------------------------------------------------------------------------ | ||
-- The Agda standard library | ||
-- | ||
-- Naperian functor | ||
-- | ||
-- Definitions of Naperian Functors, as named by Hancock and McBride, | ||
-- and subsequently documented by Jeremy Gibbons | ||
-- in the article "APLicative Programming with Naperian Functors" | ||
-- which appeared at ESOP 2017. | ||
-- https://link.springer.com/chapter/10.1007/978-3-662-54434-1_21 | ||
------------------------------------------------------------------------ | ||
|
||
{-# OPTIONS --cubical-compatible --safe #-} | ||
|
||
module Effect.Functor.Naperian where | ||
|
||
open import Effect.Functor using (RawFunctor) | ||
open import Function.Bundles using (_⟶ₛ_; _⟨$⟩_; Func) | ||
open import Level using (Level; suc; _⊔_) | ||
open import Relation.Binary.Bundles using (Setoid) | ||
open import Relation.Binary.PropositionalEquality.Core using (_≡_) | ||
|
||
private | ||
variable | ||
a b c e f : Level | ||
A : Set a | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If this choice causes ambiguity problems with |
||
|
||
-- From the paper: | ||
-- "Functor f is Naperian if there is a type p of ‘positions’ such that fa≃p→a; | ||
-- then p behaves a little like a logarithm of f | ||
-- in particular, if f and g are both Naperian, | ||
-- then Log(f×g)≃Logf+Logg and Log(f.g) ≃ Log f × Log g" | ||
|
||
-- RawNaperian contains just the functions, not the proofs | ||
record RawNaperian {F : Set a → Set b} c (RF : RawFunctor F) : Set (suc (a ⊔ c) ⊔ b) where | ||
field | ||
Log : Set c | ||
index : F A → (Log → A) | ||
tabulate : (Log → A) → F A | ||
|
||
-- Full Naperian has the coherence conditions too. | ||
-- Propositional version (hard to work with). | ||
|
||
module Propositional where | ||
record Naperian {F : Set a → Set b} c (RF : RawFunctor F) : Set (suc (a ⊔ c) ⊔ b) where | ||
field | ||
rawNaperian : RawNaperian c RF | ||
open RawNaperian rawNaperian public | ||
field | ||
tabulate-index : (fa : F A) → tabulate (index fa) ≡ fa | ||
index-tabulate : (f : Log → A) → ((l : Log) → index (tabulate f) l ≡ f l) | ||
Comment on lines
+41
to
+51
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is |
||
|
||
module _ {F : Set a → Set b} c (RF : RawFunctor F) where | ||
private | ||
FA : (AS : Setoid a e) → (rn : RawNaperian c RF) → Setoid b (c ⊔ e) | ||
FA AS rn = record | ||
{ Carrier = F X | ||
; _≈_ = λ fx fy → (l : Log) → index fx l ≈ index fy l | ||
; isEquivalence = record | ||
{ refl = λ _ → refl | ||
; sym = λ eq l → sym (eq l) | ||
; trans = λ i≈j j≈k l → trans (i≈j l) (j≈k l) | ||
} | ||
} | ||
where | ||
open Setoid AS renaming (Carrier to X) | ||
Comment on lines
+55
to
+66
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Conventionally, in the
record
{ _≈_ = λ (fx fy : F A) → (l : Log) → index fx l ≈ index fy l
... but YMMV |
||
open RawNaperian rn | ||
|
||
record Naperian (AS : Setoid a e) : Set (suc a ⊔ b ⊔ suc c ⊔ e) where | ||
field | ||
rawNaperian : RawNaperian c RF | ||
open RawNaperian rawNaperian public | ||
Comment on lines
+69
to
+72
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is the one area of the design with which I strongly diverge from your choices: this definition makes the ... so I'd be interested to learn the rationale for this choice! |
||
private | ||
module FS = Setoid (FA AS rawNaperian) | ||
module A = Setoid AS | ||
Comment on lines
+74
to
+75
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Similar comments to the above about 'conventional' naming? |
||
field | ||
tabulate-index : (fx : F A.Carrier) → tabulate (index fx) FS.≈ fx | ||
index-tabulate : (f : Log → A.Carrier) → ((l : Log) → index (tabulate f) l A.≈ f l) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.