Skip to content

Exponential time growth when repeating pure () #13858

Description

@Rob23oba

Prerequisites

Description

A do block that only consists of pure ()s take a time exponential in the amount pure ()s. This is due to mkBindUnlessPure running the continuation twice, even if it is non-duplicable.

Context

Observing a non-duplicable continuation get run twice.

Steps to Reproduce

set_option backward.do.legacy false

def test : IO Unit := do
  pure () -- 1
  pure () -- 2
  pure () -- 3
  pure () -- 4
  pure () -- 5
  pure () -- 6
  pure () -- 7
  pure () -- 8
  pure () -- 9
  pure () -- 10
  pure () -- 11
  pure () -- 12
  pure () -- 13
  pure () -- 14

Expected behavior:
The time it takes to elaborate test is roughly twice as much as if there were 7 pure ()s (i.e. negligible).

Actual behavior:
test takes multiple seconds to elaborate, roughly twice as much as if there were 13 pure ()s.

Versions

Lean 4.31.0, commit 2cd9863

Impact

Add 👍 to issues you consider important. If others are impacted by this issue, please ask them to add 👍 to it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P-lowWe are not planning to work on this issuebugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions