File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -6,6 +6,7 @@ Author: Leonardo de Moura
66prelude
77import Init.Control.Basic
88import Init.Data.List.Basic
9+ import Init.Data.Nat.Log2
910
1011namespace List
1112universe u v w u₁ u₂
@@ -48,9 +49,15 @@ def mapM {m : Type u → Type v} [Monad m] {α : Type w} {β : Type u} (f : α
4849 loop as []
4950
5051@[specialize]
51- def mapA {m : Type u → Type v} [Applicative m] {α : Type w} {β : Type u} (f : α → m β) : List α → m (List β)
52- | [] => pure []
53- | a::as => List.cons <$> f a <*> mapA f as
52+ def mapA {m : Type u → Type v} [Applicative m] {α : Type w} {β : Type u} (f : α → m β) (as : List α) : m (List β) :=
53+ let rec @[specialize] go : Nat → List α → List α × m (List β → List β)
54+ | 0 , [] => ([], pure id)
55+ | 0 , a::as => (as, List.cons <$> f a)
56+ | n+1 , as =>
57+ let (as, f₁) := go n as
58+ let (as, f₂) := go n as
59+ (as, Function.comp <$> f₁ <*> f₂)
60+ (· []) <$> (go as.length.log2 as).2
5461
5562@[specialize]
5663protected def forM {m : Type u → Type v} [Monad m] {α : Type w} (as : List α) (f : α → m PUnit) : m PUnit :=
You can’t perform that action at this time.
0 commit comments