Skip to content

Commit 9dbbd7d

Browse files
committed
feat: binary recursive implementation of List.mapA
1 parent d988849 commit 9dbbd7d

1 file changed

Lines changed: 10 additions & 3 deletions

File tree

src/Init/Data/List/Control.lean

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Author: Leonardo de Moura
66
prelude
77
import Init.Control.Basic
88
import Init.Data.List.Basic
9+
import Init.Data.Nat.Log2
910

1011
namespace List
1112
universe 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]
5663
protected def forM {m : Type u → Type v} [Monad m] {α : Type w} (as : List α) (f : α → m PUnit) : m PUnit :=

0 commit comments

Comments
 (0)