-
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?
Conversation
with two records : `RawNaperian` and `Naperian`
Added new file `Effect.Functor.Naperian` and two records to it
…tdlib into task2-Naperian
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.
A very nice initial go at a contribution in this area, and hopefully one which can be taken further as suggested, without too much difficulty.
src/Effect/Functor/Naperian.agda
Outdated
|
||
-- " 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" |
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.
So it would be great if your PR could come good on this promise by exhibiting the constructions?
src/Effect/Functor/Naperian.agda
Outdated
rawNaperian : RawNaperian d RF | ||
open RawNaperian rawNaperian public | ||
field | ||
tabulate-index : ∀ {A} → (fa : F A) → tabulate (index fa) ≡ fa |
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.
So: here the induced Setoid
relation on F A
?
I should take this PR over. I'm not entirely sure I know how? |
Given the comment of @JacquesCarette above, @jamesmckinna would you be willing to take over this? Otherwise, I'll close it. |
@MatthewDaggitt @JacquesCarette happy to take over on this one, but it'll be a while before I return proper attention to it, if that's OK? |
Minimal cleanup for the time being. |
Effect.Functor.Naperian
to stdlib Effect.Functor.Naperian
Thanks a lot! I've been wanting to come back to these, but I've barely found enough time to do a few reviews. |
This is now back onto my plate to finish. And I even know how to do so! |
Fantastic! I'm happy to hand the baton back. But sign me up as a reviewer come the right time... |
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.
Besides the notational nitpicking (which I think important, but advisory here), I think the design needs some more thinking as to the dependency/parametrisation in the Setoid
case.
-- 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. |
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.
-- 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. | |
-- Naperian Functors, as defined by Hancock and McBride, and | |
-- subsequently documented by Jeremy Gibbons in the paper | |
-- "APLicative Programming with Naperian Functors" (ESOP 2017). |
-- 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) |
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.
Is Propositional.Naperian
definable directly from Naperian (≡.setoid A)
below?
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) |
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.
Conventionally, in the stdlib
S
is the genericSetoid
;AS
seems weird hereopen Setoid S renaming (Carrier to A)
, ditto.- the
Carrier
field is (usually) not mentioned; I might be tempted just to write
record
{ _≈_ = λ (fx fy : F A) → (l : Log) → index fx l ≈ index fy l
...
but YMMV
module FS = Setoid (FA AS rawNaperian) | ||
module A = Setoid AS |
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.
Similar comments to the above about 'conventional' naming?
record Naperian (AS : Setoid a e) : Set (suc a ⊔ b ⊔ suc c ⊔ e) where | ||
field | ||
rawNaperian : RawNaperian c RF | ||
open RawNaperian rawNaperian public |
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.
This is the one area of the design with which I strongly diverge from your choices: this definition makes the RawNaperian
structure potentially depend(ent) on the argument index AS
, and that for me is a deal-breaker...
... so I'd be interested to learn the rationale for this choice!
private | ||
variable | ||
a b c e f : Level | ||
A : Set a |
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.
If this choice causes ambiguity problems with open
ing Setoid
etc. below, then suggest removing it in favour of ∀ {A} → ...
in the types of index
and tabulate
below...
The PR is still DRAFT, so I'll revisit/re-review when it's 'ready', but at that point I'll also revisit the early comment above about proving the 'logarithm' properties. |
New module
Effect.Functor.Naperian
added to stdlib.With two records defining Naperian functors:
record RawNaperian
record Naperian
.