leanprover / leanprover/lean4

`←` lifts over `&&` in `do` blocks, defeating short-circuiting

Open
#8,857 0 comments 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug do-notation P-medium
Dominant language
Lean
Stars
9.2k
Forks
990
Avg merge
1d 17h
Merged PRs (30d)
175

Description

Prerequisites

Please put an X between the brackets as you perform the following steps:

Description
def bar : IO Bool := do
  IO.println "bar called"
  return true

def foo : Bool := false

def test₁ : IO Unit := do
  if foo && (← bar) then
    IO.println "branch taken"

-- bar called
#eval test₁

def test₂ : IO Unit := do
  if foo then
    if ← bar then
      IO.println "branch taken"

-- bar not called
#eval test₂

In this code, I expect that bar is not called in both cases (or, more precisely, that the monadic effect of bar does not happen) due to the short circuiting behavior of &&.

Context

This could be considered as a variant of #3713.

Steps to Reproduce
  1. Copy the code above into live.lean-lang.org

Expected behavior: The monadic effect of bar is not observed.

Actual behavior: The monadic effect of bar is observed.

Versions

4.22.0-nightly-2025-06-17 on live.lean-lang.org

Impact

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

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by running the minimal reproducer from the issue in live.lean-lang.org and compare test₁ with test₂, focusing on how is handled in the if foo && ... expression inside a do block. Done means the monadic effect of bar is not observed when foo is false, matching the nested-if example.

Written by the indexing model from the issue text.

Assessment

Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.