Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+โ†‘Ctrl+โ†“to navigate, Ctrl+๐Ÿ–ฑ๏ธto focus. On Mac, use Cmdinstead of Ctrl.
/-
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Simon Hudon, E.W.Ayers
-/
import Mathlib.Algebra.Group.Defs

/-!
# Writer monads

This file introduces monads for managing immutable, appendable state.
Common applications are logging monads where the monad logs messages as the
computation progresses.

## References
- https://hackage.haskell.org/package/mtl-2.2.1/docs/Control-Monad-Writer-Class.html
- [Original Mark P Jones article introducing `Writer`](https://web.cecs.pdx.edu/~mpj/pubs/springschool.html)

-/

def 
WriterT: Type u โ†’ (Type u โ†’ Type v) โ†’ Type u โ†’ Type v
WriterT
(
ฯ‰: Type u
ฯ‰
:
Type u: Type (u+1)
Type u
) (
M: Type u โ†’ Type v
M
:
Type u: Type (u+1)
Type u
โ†’
Type v: Type (v+1)
Type v
) (
ฮฑ: Type u
ฮฑ
:
Type u: Type (u+1)
Type u
) :
Type v: Type (v+1)
Type v
:=
M: Type u โ†’ Type v
M
(
ฮฑ: Type u
ฮฑ
ร—
ฯ‰: Type u
ฯ‰
) @[reducible] def
Writer: Type u_1 โ†’ Type u_1 โ†’ Type u_1
Writer
ฯ‰: ?m.28
ฯ‰
:=
WriterT: Type ?u.36 โ†’ (Type ?u.36 โ†’ Type ?u.35) โ†’ Type ?u.36 โ†’ Type ?u.35
WriterT
ฯ‰: ?m.28
ฯ‰
Id: Type ?u.41 โ†’ Type ?u.41
Id
class
MonadWriter: outParam (Type u) โ†’ (Type u โ†’ Type v) โ†’ Type (max(u+1)v)
MonadWriter
(
ฯ‰: outParam (Type u)
ฯ‰
:
outParam: Sort ?u.51 โ†’ Sort ?u.51
outParam
(
Type u: Type (u+1)
Type u
)) (
M: Type u โ†’ Type v
M
:
Type u: Type (u+1)
Type u
โ†’
Type v: Type (v+1)
Type v
) where
tell: {ฯ‰ : outParam (Type u)} โ†’ {M : Type u โ†’ Type v} โ†’ [self : MonadWriter ฯ‰ M] โ†’ ฯ‰ โ†’ M PUnit
tell
:
ฯ‰: outParam (Type u)
ฯ‰
โ†’
M: Type u โ†’ Type v
M
PUnit: Sort ?u.62
PUnit
listen: {ฯ‰ : outParam (Type u)} โ†’ {M : Type u โ†’ Type v} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type u} โ†’ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
listen
{
ฮฑ: ?m.65
ฮฑ
} :
M: Type u โ†’ Type v
M
ฮฑ: ?m.65
ฮฑ
โ†’
M: Type u โ†’ Type v
M
(
ฮฑ: ?m.65
ฮฑ
ร—
ฯ‰: outParam (Type u)
ฯ‰
)
pass: {ฯ‰ : outParam (Type u)} โ†’ {M : Type u โ†’ Type v} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type u} โ†’ M (ฮฑ ร— (ฯ‰ โ†’ ฯ‰)) โ†’ M ฮฑ
pass
{
ฮฑ: ?m.74
ฮฑ
} :
M: Type u โ†’ Type v
M
(
ฮฑ: ?m.74
ฮฑ
ร— (
ฯ‰: outParam (Type u)
ฯ‰
โ†’
ฯ‰: outParam (Type u)
ฯ‰
)) โ†’
M: Type u โ†’ Type v
M
ฮฑ: ?m.74
ฮฑ
export MonadWriter (tell listen pass) variable {
M: Type u โ†’ Type v
M
:
Type u: Type (u+1)
Type u
โ†’
Type v: Type (v+1)
Type v
} [
Monad: (Type ?u.96 โ†’ Type ?u.95) โ†’ Type (max(?u.96+1)?u.95)
Monad
M: Type u โ†’ Type v
M
]
instance: {M : Type u โ†’ Type v} โ†’ {ฯ‰ ฯ : Type u} โ†’ [inst : MonadWriter ฯ‰ M] โ†’ MonadWriter ฯ‰ (ReaderT ฯ M)
instance
[
MonadWriter: outParam (Type ?u.137) โ†’ (Type ?u.137 โ†’ Type ?u.136) โ†’ Type (max(?u.137+1)?u.136)
MonadWriter
ฯ‰: ?m.116
ฯ‰
M: Type u โ†’ Type v
M
] :
MonadWriter: outParam (Type ?u.144) โ†’ (Type ?u.144 โ†’ Type ?u.143) โ†’ Type (max(?u.144+1)?u.143)
MonadWriter
ฯ‰: ?m.116
ฯ‰
(
ReaderT: Type ?u.146 โ†’ (Type ?u.146 โ†’ Type ?u.145) โ†’ Type ?u.146 โ†’ Type (max?u.146?u.145)
ReaderT
ฯ: ?m.133
ฯ
M: Type u โ†’ Type v
M
) where tell
w: ?m.168
w
:= (
tell: {ฯ‰ : outParam (Type ?u.173)} โ†’ {M : Type ?u.173 โ†’ Type ?u.172} โ†’ [self : MonadWriter ฯ‰ M] โ†’ ฯ‰ โ†’ M PUnit
tell
w: ?m.168
w
:
M: Type u โ†’ Type v
M
_: Type u
_
) listen
x: ?m.259
x
r: ?m.262
r
:=
listen: {ฯ‰ : outParam (Type ?u.265)} โ†’ {M : Type ?u.265 โ†’ Type ?u.264} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type ?u.265} โ†’ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
listen
<|
x: ?m.259
x
r: ?m.262
r
pass
x: ?m.288
x
r: ?m.291
r
:=
pass: {ฯ‰ : outParam (Type ?u.294)} โ†’ {M : Type ?u.294 โ†’ Type ?u.293} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type ?u.294} โ†’ M (ฮฑ ร— (ฯ‰ โ†’ ฯ‰)) โ†’ M ฮฑ
pass
<|
x: ?m.288
x
r: ?m.291
r
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ ฯƒ : Type u} โ†’ [inst : MonadWriter ฯ‰ M] โ†’ MonadWriter ฯ‰ (StateT ฯƒ M)
instance
[
MonadWriter: outParam (Type ?u.701) โ†’ (Type ?u.701 โ†’ Type ?u.700) โ†’ Type (max(?u.701+1)?u.700)
MonadWriter
ฯ‰: ?m.680
ฯ‰
M: Type u โ†’ Type v
M
] :
MonadWriter: outParam (Type ?u.708) โ†’ (Type ?u.708 โ†’ Type ?u.707) โ†’ Type (max(?u.708+1)?u.707)
MonadWriter
ฯ‰: ?m.680
ฯ‰
(
StateT: Type ?u.710 โ†’ (Type ?u.710 โ†’ Type ?u.709) โ†’ Type ?u.710 โ†’ Type (max?u.710?u.709)
StateT
ฯƒ: ?m.697
ฯƒ
M: Type u โ†’ Type v
M
) where tell
w: ?m.732
w
:= (
tell: {ฯ‰ : outParam (Type ?u.737)} โ†’ {M : Type ?u.737 โ†’ Type ?u.736} โ†’ [self : MonadWriter ฯ‰ M] โ†’ ฯ‰ โ†’ M PUnit
tell
w: ?m.732
w
:
M: Type u โ†’ Type v
M
_: Type u
_
) listen
x: ?m.832
x
s: ?m.835
s
:= (fun ((
a: ฮฑโœ
a
,
w: ฯƒ
w
),
s: ฯ‰
s
) โ†ฆ ((
a: ฮฑโœ
a
,
s: ฯ‰
s
),
w: ฯƒ
w
)) <$>
listen: {ฯ‰ : outParam (Type ?u.862)} โ†’ {M : Type ?u.862 โ†’ Type ?u.861} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type ?u.862} โ†’ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
listen
(
x: ?m.832
x
s: ?m.835
s
) pass
x: ?m.913
x
s: ?m.916
s
:=
pass: {ฯ‰ : outParam (Type ?u.919)} โ†’ {M : Type ?u.919 โ†’ Type ?u.918} โ†’ [self : MonadWriter ฯ‰ M] โ†’ {ฮฑ : Type ?u.919} โ†’ M (ฮฑ ร— (ฯ‰ โ†’ ฯ‰)) โ†’ M ฮฑ
pass
<| (fun ((
a: ฮฑโœ
a
,
f: ฯ‰ โ†’ ฯ‰
f
),
s: ฯƒ
s
) โ†ฆ ((
a: ฮฑโœ
a
,
s: ฯƒ
s
),
f: ฯ‰ โ†’ ฯ‰
f
)) <$> (
x: ?m.913
x
s: ?m.916
s
) namespace WriterT protected def
mk: {M : Type u โ†’ Type v} โ†’ {ฮฑ ฯ‰ : Type u} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
mk
{
ฯ‰: Type u
ฯ‰
:
Type u: Type (u+1)
Type u
} (
cmd: M (ฮฑ ร— ฯ‰)
cmd
:
M: Type u โ†’ Type v
M
(
ฮฑ: ?m.2118
ฮฑ
ร—
ฯ‰: Type u
ฯ‰
)) :
WriterT: Type ?u.2128 โ†’ (Type ?u.2128 โ†’ Type ?u.2127) โ†’ Type ?u.2128 โ†’ Type ?u.2127
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
ฮฑ: ?m.2118
ฮฑ
:=
cmd: M (ฮฑ ร— ฯ‰)
cmd
protected def
run: {ฮฑ ฯ‰ : Type u} โ†’ WriterT ฯ‰ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
run
{
ฯ‰: Type u
ฯ‰
:
Type u: Type (u+1)
Type u
} (
cmd: WriterT ฯ‰ M ฮฑ
cmd
:
WriterT: Type ?u.2222 โ†’ (Type ?u.2222 โ†’ Type ?u.2221) โ†’ Type ?u.2222 โ†’ Type ?u.2221
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
ฮฑ: ?m.2216
ฮฑ
) :
M: Type u โ†’ Type v
M
(
ฮฑ: ?m.2216
ฮฑ
ร—
ฯ‰: Type u
ฯ‰
) :=
cmd: WriterT ฯ‰ M ฮฑ
cmd
protected def
runThe: {ฮฑ : Type u} โ†’ (ฯ‰ : Type u) โ†’ WriterT ฯ‰ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
runThe
(
ฯ‰: Type u
ฯ‰
:
Type u: Type (u+1)
Type u
) (
cmd: WriterT ฯ‰ M ฮฑ
cmd
:
WriterT: Type ?u.2321 โ†’ (Type ?u.2321 โ†’ Type ?u.2320) โ†’ Type ?u.2321 โ†’ Type ?u.2320
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
ฮฑ: ?m.2315
ฮฑ
) :
M: Type u โ†’ Type v
M
(
ฮฑ: ?m.2315
ฮฑ
ร—
ฯ‰: Type u
ฯ‰
) :=
cmd: WriterT ฯ‰ M ฮฑ
cmd
variable {
ฯ‰: Type u
ฯ‰
:
Type u: Type (u+1)
Type u
} {
ฮฑ: Type u
ฮฑ
ฮฒ: Type u
ฮฒ
:
Type u: Type (u+1)
Type u
} /-- Creates an instance of Monad, with an explicitly given empty and append operation. Previously, this would have used an instance of `[Monoid ฯ‰]` as input. In practice, however, WriterT is used for logging and creating lists so restricting to monoids with `Mul` and `One` can make `WriterT` cumbersome to use. This is used to derive instances for both `[EmptyCollection ฯ‰] [Append ฯ‰]` and `[Monoid ฯ‰]`. -/ def
monad: ฯ‰ โ†’ (ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰) โ†’ Monad (WriterT ฯ‰ M)
monad
(
empty: ฯ‰
empty
:
ฯ‰: Type u
ฯ‰
) (
append: ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰
append
:
ฯ‰: Type u
ฯ‰
โ†’
ฯ‰: Type u
ฯ‰
โ†’
ฯ‰: Type u
ฯ‰
) :
Monad: (Type ?u.2438 โ†’ Type ?u.2437) โ†’ Type (max(?u.2438+1)?u.2437)
Monad
(
WriterT: Type ?u.2440 โ†’ (Type ?u.2440 โ†’ Type ?u.2439) โ†’ Type ?u.2440 โ†’ Type ?u.2439
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where map := fun
f: ?m.2473
f
(
cmd: M ?m.2477
cmd
:
M: Type u โ†’ Type v
M
_: Type u
_
) โ†ฆ
WriterT.mk: {M : Type ?u.2481 โ†’ Type ?u.2480} โ†’ {ฮฑ ฯ‰ : Type ?u.2481} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$ (fun (
a: ฮฑโœ
a
,
w: ฯ‰
w
) โ†ฆ (
f: ?m.2473
f
a: ฮฑโœ
a
,
w: ฯ‰
w
)) <$>
cmd: M ?m.2477
cmd
pure := fun
a: ?m.2561
a
โ†ฆ
pure: {f : Type ?u.2564 โ†’ Type ?u.2563} โ†’ [self : Pure f] โ†’ {ฮฑ : Type ?u.2564} โ†’ ฮฑ โ†’ f ฮฑ
pure
(f :=
M: Type u โ†’ Type v
M
) (
a: ?m.2561
a
,
empty: ฯ‰
empty
) bind := fun (
cmd: M ?m.2684
cmd
:
M: Type u โ†’ Type v
M
_: Type u
_
)
f: ?m.2687
f
โ†ฆ
WriterT.mk: {M : Type ?u.2692 โ†’ Type ?u.2691} โ†’ {ฮฑ ฯ‰ : Type ?u.2692} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$
cmd: M ?m.2684
cmd
>>= fun (
a: ฮฑโœ
a
,
wโ‚: ฯ‰
wโ‚
) โ†ฆ (fun (
b: ฮฒโœ
b
,
wโ‚‚: ฯ‰
wโ‚‚
) โ†ฆ (
b: ฮฒโœ
b
,
append: ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰
append
wโ‚: ฯ‰
wโ‚
wโ‚‚: ฯ‰
wโ‚‚
)) <$> (
f: ?m.2687
f
a: ฮฑโœ
a
) /-- Lift an `M` to a `WriterT ฯ‰ M`, using the given `empty` as the monoid unit. -/ protected def
liftTell: ฯ‰ โ†’ MonadLift M (WriterT ฯ‰ M)
liftTell
(
empty: ฯ‰
empty
:
ฯ‰: Type u
ฯ‰
) :
MonadLift: semiOutParam (Type ?u.4437 โ†’ Type ?u.4436) โ†’ (Type ?u.4437 โ†’ Type ?u.4435) โ†’ Type (max(max(?u.4437+1)?u.4436)?u.4435)
MonadLift
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.4442 โ†’ (Type ?u.4442 โ†’ Type ?u.4441) โ†’ Type ?u.4442 โ†’ Type ?u.4441
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where monadLift := fun
cmd: ?m.4467
cmd
โ†ฆ
WriterT.mk: {M : Type ?u.4470 โ†’ Type ?u.4469} โ†’ {ฮฑ ฯ‰ : Type ?u.4470} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$ (fun
a: ?m.4497
a
โ†ฆ (
a: ?m.4497
a
,
empty: ฯ‰
empty
)) <$>
cmd: ?m.4467
cmd
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type u} โ†’ [inst : EmptyCollection ฯ‰] โ†’ [inst : Append ฯ‰] โ†’ Monad (WriterT ฯ‰ M)
instance
[
EmptyCollection: Type ?u.4646 โ†’ Type ?u.4646
EmptyCollection
ฯ‰: Type u
ฯ‰
] [
Append: Type ?u.4649 โ†’ Type ?u.4649
Append
ฯ‰: Type u
ฯ‰
] :
Monad: (Type ?u.4653 โ†’ Type ?u.4652) โ†’ Type (max(?u.4653+1)?u.4652)
Monad
(
WriterT: Type ?u.4655 โ†’ (Type ?u.4655 โ†’ Type ?u.4654) โ†’ Type ?u.4655 โ†’ Type ?u.4654
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) :=
monad: {M : Type ?u.4668 โ†’ Type ?u.4667} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type ?u.4668} โ†’ ฯ‰ โ†’ (ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰) โ†’ Monad (WriterT ฯ‰ M)
monad
โˆ…: ?m.4702
โˆ…
(ยท ++ ยท): ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰
(ยท ++ ยท)
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type u} โ†’ [inst : EmptyCollection ฯ‰] โ†’ MonadLift M (WriterT ฯ‰ M)
instance
[
EmptyCollection: Type ?u.4920 โ†’ Type ?u.4920
EmptyCollection
ฯ‰: Type u
ฯ‰
] :
MonadLift: semiOutParam (Type ?u.4925 โ†’ Type ?u.4924) โ†’ (Type ?u.4925 โ†’ Type ?u.4923) โ†’ Type (max(max(?u.4925+1)?u.4924)?u.4923)
MonadLift
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.4930 โ†’ (Type ?u.4930 โ†’ Type ?u.4929) โ†’ Type ?u.4930 โ†’ Type ?u.4929
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) :=
WriterT.liftTell: {M : Type ?u.4942 โ†’ Type ?u.4941} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type ?u.4942} โ†’ ฯ‰ โ†’ MonadLift M (WriterT ฯ‰ M)
WriterT.liftTell
โˆ…: ?m.4981
โˆ…
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type u} โ†’ [inst : Monoid ฯ‰] โ†’ Monad (WriterT ฯ‰ M)
instance
[
Monoid: Type ?u.5111 โ†’ Type ?u.5111
Monoid
ฯ‰: Type u
ฯ‰
] :
Monad: (Type ?u.5115 โ†’ Type ?u.5114) โ†’ Type (max(?u.5115+1)?u.5114)
Monad
(
WriterT: Type ?u.5117 โ†’ (Type ?u.5117 โ†’ Type ?u.5116) โ†’ Type ?u.5117 โ†’ Type ?u.5116
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) :=
monad: {M : Type ?u.5129 โ†’ Type ?u.5128} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type ?u.5129} โ†’ ฯ‰ โ†’ (ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰) โ†’ Monad (WriterT ฯ‰ M)
monad
1: ?m.5165
1
(ยท * ยท): ฯ‰ โ†’ ฯ‰ โ†’ ฯ‰
(ยท * ยท)
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type u} โ†’ [inst : Monoid ฯ‰] โ†’ MonadLift M (WriterT ฯ‰ M)
instance
[
Monoid: Type ?u.5470 โ†’ Type ?u.5470
Monoid
ฯ‰: Type u
ฯ‰
] :
MonadLift: semiOutParam (Type ?u.5475 โ†’ Type ?u.5474) โ†’ (Type ?u.5475 โ†’ Type ?u.5473) โ†’ Type (max(max(?u.5475+1)?u.5474)?u.5473)
MonadLift
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.5480 โ†’ (Type ?u.5480 โ†’ Type ?u.5479) โ†’ Type ?u.5480 โ†’ Type ?u.5479
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) :=
WriterT.liftTell: {M : Type ?u.5492 โ†’ Type ?u.5491} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type ?u.5492} โ†’ ฯ‰ โ†’ MonadLift M (WriterT ฯ‰ M)
WriterT.liftTell
1: ?m.5533
1
instance: {M : Type u โ†’ Type v} โ†’ [inst : Monad M] โ†’ {ฯ‰ : Type u} โ†’ MonadWriter ฯ‰ (WriterT ฯ‰ M)
instance
:
MonadWriter: outParam (Type ?u.5700) โ†’ (Type ?u.5700 โ†’ Type ?u.5699) โ†’ Type (max(?u.5700+1)?u.5699)
MonadWriter
ฯ‰: Type u
ฯ‰
(
WriterT: Type ?u.5702 โ†’ (Type ?u.5702 โ†’ Type ?u.5701) โ†’ Type ?u.5702 โ†’ Type ?u.5701
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where tell := fun
w: ?m.5721
w
โ†ฆ
WriterT.mk: {M : Type ?u.5724 โ†’ Type ?u.5723} โ†’ {ฮฑ ฯ‰ : Type ?u.5724} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$
pure: {f : Type ?u.5734 โ†’ Type ?u.5733} โ†’ [self : Pure f] โ†’ {ฮฑ : Type ?u.5734} โ†’ ฮฑ โ†’ f ฮฑ
pure
(
โŸจโŸฉ: PUnit
โŸจโŸฉ
,
w: ?m.5721
w
) listen := fun
cmd: ?m.5799
cmd
โ†ฆ
WriterT.mk: {M : Type ?u.5802 โ†’ Type ?u.5801} โ†’ {ฮฑ ฯ‰ : Type ?u.5802} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$ (fun (
a: ฮฑโœ
a
,
w: ฯ‰
w
) โ†ฆ ((
a: ฮฑโœ
a
,
w: ฯ‰
w
),
w: ฯ‰
w
)) <$>
cmd: ?m.5799
cmd
pass := fun
cmd: ?m.5862
cmd
โ†ฆ
WriterT.mk: {M : Type ?u.5865 โ†’ Type ?u.5864} โ†’ {ฮฑ ฯ‰ : Type ?u.5865} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$ (fun ((
a: ฮฑโœ
a
,
f: ฯ‰ โ†’ ฯ‰
f
),
w: ฯ‰
w
) โ†ฆ (
a: ฮฑโœ
a
,
f: ฯ‰ โ†’ ฯ‰
f
w: ฯ‰
w
)) <$>
cmd: ?m.5862
cmd
instance: {M : Type u โ†’ Type v} โ†’ {ฯ‰ : Type u} โ†’ {ฮต : Type u_1} โ†’ [inst : MonadExcept ฮต M] โ†’ MonadExcept ฮต (WriterT ฯ‰ M)
instance
[
MonadExcept: outParam (Type ?u.6660) โ†’ (Type ?u.6659 โ†’ Type ?u.6658) โ†’ Type (max(max?u.6660(?u.6659+1))?u.6658)
MonadExcept
ฮต: ?m.6655
ฮต
M: Type u โ†’ Type v
M
] :
MonadExcept: outParam (Type ?u.6668) โ†’ (Type ?u.6667 โ†’ Type ?u.6666) โ†’ Type (max(max?u.6668(?u.6667+1))?u.6666)
MonadExcept
ฮต: ?m.6655
ฮต
(
WriterT: Type ?u.6670 โ†’ (Type ?u.6670 โ†’ Type ?u.6669) โ†’ Type ?u.6670 โ†’ Type ?u.6669
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where throw := fun
e: ?m.6693
e
โ†ฆ
WriterT.mk: {M : Type ?u.6696 โ†’ Type ?u.6695} โ†’ {ฮฑ ฯ‰ : Type ?u.6696} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$
throw: {ฮต : outParam (Type ?u.6707)} โ†’ {m : Type ?u.6706 โ†’ Type ?u.6705} โ†’ [self : MonadExcept ฮต m] โ†’ {ฮฑ : Type ?u.6706} โ†’ ฮต โ†’ m ฮฑ
throw
e: ?m.6693
e
tryCatch := fun
cmd: ?m.6737
cmd
c: ?m.6740
c
โ†ฆ
WriterT.mk: {M : Type ?u.6745 โ†’ Type ?u.6744} โ†’ {ฮฑ ฯ‰ : Type ?u.6745} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$
tryCatch: {ฮต : outParam (Type ?u.6752)} โ†’ {m : Type ?u.6751 โ†’ Type ?u.6750} โ†’ [self : MonadExcept ฮต m] โ†’ {ฮฑ : Type ?u.6751} โ†’ m ฮฑ โ†’ (ฮต โ†’ m ฮฑ) โ†’ m ฮฑ
tryCatch
cmd: ?m.6737
cmd
fun
e: ?m.6767
e
โ†ฆ (
c: ?m.6740
c
e: ?m.6767
e
).
run: {M : Type ?u.6770 โ†’ Type ?u.6769} โ†’ {ฮฑ ฯ‰ : Type ?u.6770} โ†’ WriterT ฯ‰ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
run
instance: {M : Type u โ†’ Type v} โ†’ {ฯ‰ : Type u} โ†’ [inst : MonadLiftT M (WriterT ฯ‰ M)] โ†’ MonadControl M (WriterT ฯ‰ M)
instance
[
MonadLiftT: (Type ?u.7065 โ†’ Type ?u.7064) โ†’ (Type ?u.7065 โ†’ Type ?u.7063) โ†’ Type (max(max(?u.7065+1)?u.7064)?u.7063)
MonadLiftT
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.7070 โ†’ (Type ?u.7070 โ†’ Type ?u.7069) โ†’ Type ?u.7070 โ†’ Type ?u.7069
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
)] :
MonadControl: semiOutParam (Type ?u.7083 โ†’ Type ?u.7082) โ†’ (Type ?u.7083 โ†’ Type ?u.7081) โ†’ Type (max(max(?u.7083+1)?u.7082)?u.7081)
MonadControl
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.7088 โ†’ (Type ?u.7088 โ†’ Type ?u.7087) โ†’ Type ?u.7088 โ†’ Type ?u.7087
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where stM := fun
ฮฑ: ?m.7112
ฮฑ
โ†ฆ
ฮฑ: ?m.7112
ฮฑ
ร—
ฯ‰: Type u
ฯ‰
liftWith
f: ?m.7120
f
:=
liftM: {m : Type ?u.7127 โ†’ Type ?u.7126} โ†’ {n : Type ?u.7127 โ†’ Type ?u.7125} โ†’ [self : MonadLiftT m n] โ†’ {ฮฑ : Type ?u.7127} โ†’ m ฮฑ โ†’ n ฮฑ
liftM
<|
f: ?m.7120
f
fun
x: ?m.7147
x
โ†ฆ
x: ?m.7147
x
.
run: {M : Type ?u.7150 โ†’ Type ?u.7149} โ†’ {ฮฑ ฯ‰ : Type ?u.7150} โ†’ WriterT ฯ‰ M ฮฑ โ†’ M (ฮฑ ร— ฯ‰)
run
restoreM :=
WriterT.mk: {M : Type ?u.7195 โ†’ Type ?u.7194} โ†’ {ฮฑ ฯ‰ : Type ?u.7195} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
instance: {M : Type u โ†’ Type v} โ†’ {ฯ‰ : Type u} โ†’ MonadFunctor M (WriterT ฯ‰ M)
instance
:
MonadFunctor: semiOutParam (Type ?u.7378 โ†’ Type ?u.7377) โ†’ (Type ?u.7378 โ†’ Type ?u.7376) โ†’ Type (max(max(?u.7378+1)?u.7377)?u.7376)
MonadFunctor
M: Type u โ†’ Type v
M
(
WriterT: Type ?u.7383 โ†’ (Type ?u.7383 โ†’ Type ?u.7382) โ†’ Type ?u.7383 โ†’ Type ?u.7382
WriterT
ฯ‰: Type u
ฯ‰
M: Type u โ†’ Type v
M
) where monadMap := fun
k: ?m.7407
k
(
w: M ?m.7412
w
:
M: Type u โ†’ Type v
M
_: Type u
_
) โ†ฆ
WriterT.mk: {M : Type ?u.7416 โ†’ Type ?u.7415} โ†’ {ฮฑ ฯ‰ : Type ?u.7416} โ†’ M (ฮฑ ร— ฯ‰) โ†’ WriterT ฯ‰ M ฮฑ
WriterT.mk
$
k: ?m.7407
k
w: M ?m.7412
w
end WriterT