Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. -- List monad
  2.  
  3. {-# OPTIONS --without-K --safe #-}
  4.  
  5. module ListMonad where
  6.  
  7. -- agda-stdlib
  8. open import Data.List
  9. open import Data.List.Properties
  10. import Relation.Binary.PropositionalEquality as ≡
  11.  
  12. -- agda-categories
  13. open import Categories.Monad
  14. open import Categories.Functor renaming (id to idF)
  15. open import Categories.NaturalTransformation
  16. open import Categories.Category.Instance.Sets
  17.  
  18. List-functor : ∀ {o} → Endofunctor (Sets o)
  19. List-functor = record
  20. { F₀ = List
  21. ; F₁ = map
  22. ; identity = map-id _
  23. ; homomorphism = map-compose _
  24. ; F-resp-≈ = λ f≈g → map-cong (λ _ → f≈g) _
  25. }
  26.  
  27. singleton-NT : ∀ {o} → NaturalTransformation idF (List-functor {o})
  28. singleton-NT = record
  29. { η = λ X → [_]
  30. ; commute = λ f → ≡.refl -- [_] ∘ f ≈ map f ∘ [_]
  31. }
  32.  
  33. concat-NT : ∀ {o} → NaturalTransformation (List-functor ∘F List-functor) (List-functor {o})
  34. concat-NT = record
  35. { η = λ X → concat
  36. ; commute = λ f {xss} → concat-map {f = f} xss -- concat ∘ map (map f) ≈ map f ∘ concat
  37. }
  38.  
  39. concat-++ : ∀ {a} {A : Set a} (xss yss : List (List A)) →
  40. concat (xss ++ yss) ≡.≡ concat xss ++ concat yss
  41. concat-++ [] yss = ≡.refl
  42. concat-++ (xs ∷ xss) yss = begin
  43. xs ++ concat (xss ++ yss) ≡⟨ ≡.cong (xs ++_) (concat-++ xss yss) ⟩
  44. xs ++ (concat xss ++ concat yss) ≡⟨ ≡.sym (++-assoc xs (concat xss) (concat yss)) ⟩
  45. (xs ++ concat xss) ++ concat yss ∎
  46. where open ≡.≡-Reasoning
  47.  
  48. concat-map-concat : ∀ {a} {A : Set a} (xsss : List (List (List A))) →
  49. concat (map concat xsss) ≡.≡ concat (concat xsss)
  50. concat-map-concat [] = ≡.refl
  51. concat-map-concat (xss ∷ xsss) = begin
  52. concat xss ++ concat (map concat xsss) ≡⟨ ≡.cong (concat xss ++_) (concat-map-concat xsss) ⟩
  53. concat xss ++ concat (concat xsss) ≡⟨ ≡.sym (concat-++ xss (concat xsss)) ⟩
  54. concat (xss ++ concat xsss) ∎
  55. where open ≡.≡-Reasoning
  56.  
  57. concat-map-singleton : ∀ {a} {A : Set a} (xs : List A) →
  58. concat (map [_] xs) ≡.≡ xs
  59. concat-map-singleton [] = ≡.refl
  60. concat-map-singleton (x ∷ xs) = ≡.cong (x ∷_) (concat-map-singleton xs)
  61.  
  62. concat-singleton : ∀ {a} {A : Set a} (xs : List A) →
  63. concat [ xs ] ≡.≡ xs
  64. concat-singleton xs = ++-identityʳ xs
  65.  
  66. List-monad : ∀ {o} → Monad (Sets o)
  67. List-monad = record
  68. { F = List-functor
  69. ; η = singleton-NT
  70. ; μ = concat-NT
  71. ; assoc = λ {_ xsss} → concat-map-concat xsss
  72. ; identityˡ = λ {_ xs} → concat-map-singleton xs
  73. ; identityʳ = λ {_ xs} → concat-singleton xs
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement