{-# OPTIONS --no-termination-check #-}
open import Algebra
open import Prelude
module Hyper.Monadic {m} {๐ : Type m โ Type m} (mon : Monad ๐) where
open Monad mon
_โฌโฒ_ : Type m โ Type m โ Type m
record _โฌ_ (A : Type m) (B : Type m) : Type m
{-# NO_POSITIVITY_CHECK #-}
record _โฌ_ A B where
inductive; constructor hyp
infixl 4 _ยท_
field _ยท_ : B โฌโฒ A โ B
open _โฌ_ public
A โฌโฒ B = ๐ (B โฌ A) โ B
pure : A โ ๐ A
pure = return
_<*>_ : ๐ (A โ B) โ ๐ A โ ๐ B
fs <*> xs = do
f โ fs
x โ xs
pure (f x)
infixr 9 _โ_ _โโฒ_ _โโณ_
mutual
_โโณ_ : B โฌโฒ C โ ๐ (A โฌ B) โ A โฌโฒ C
(f โโณ g) k = f โฆ g โ k โฆ
_โโฒ_ : B โฌ C โ A โฌโฒ B โ A โฌโฒ C
(f โโฒ g) k = f ยท g โโณ k
_โ_ : B โฌ C โ A โฌ B โ A โฌ C
f โ g ยท k = f ยท g โโฒ k
_โ_ : (A โ B) โ A โฌ B โ A โฌ B
(f โ h) ยท k = f (k (return h))
k : A โ B โฌ A
k x ยท _ = x
โณ : (A โ B) โ A โฌ B
โณ f ยท k = f (k (return (โณ f)))
๐ : A โฌ A
๐ ยท x = x (return ๐)
โฝ : A โฌ B โ A โ B
โฝ h x = h ยท ฮป _ โ x