Martin Escardo, Paulo Oliva, 2024

The list monad.

\begin{code}

{-# OPTIONS --safe --without-K #-}

module Games.List where

open import Games.Monad
open import MLTT.Spartan hiding (J)
open import MLTT.List hiding (map)

𝕃 : Monad
𝕃 = record {
 functor = List ;
 η       = [_] ;
 ext     = List-ext ;
 ext-η   = concat-singletons ;
 unit    = List-ext-unit ;
 assoc   = List-ext-assoc
 }

module List-definitions where

 _⊗ᴸ_ : {X : Type} {Y : X  Type}
       List X
       ((x : X)  List (Y x))
       List (Σ x  X , Y x)
 _⊗ᴸ_ = _⊗_ 𝕃

 ηᴸ : {X : Type}  X  List X
 ηᴸ = η 𝕃

 extᴸ : {X Y : Type}  (X  List Y)  List X  List Y
 extᴸ = ext 𝕃

 mapᴸ : {X Y : Type}  (X  Y)  List X  List Y
 mapᴸ = map 𝕃

\end{code}