The linters in Batteries can be used to spot mistakes in Lean. See the message on [Zulip](https://leanprover.zulipchat.com/#narrow/stream/270676-lean4/topic/Go-to-def.20on.20typeclass.20fields.20and.20type-dependent.20notation/near/442613564). These are the different linters with errors: - unusedArguments: There are many unused instance arguments, especially a redundant `[Monad m]` is very common - checkUnivs: There was a problem with universes in a definition in `Init.Control.StateCps`. I fixed it by adding a `variable` statement for the implicit arguments in the file. - defLemma: many proofs are written as `def` instead of `theorem`, most notably `rfl`. Because `rfl` is used as a match pattern, it must be a def. Is this desirable? The keyword `abbrev` is sometimes used for an alias of a theorem, which also results in a def. I would want to replace it with the `alias` keyword to fix this, but it isn't available. - dupNamespace: I fixed some of these, but left `Tactic.Tactic` and `Parser.Parser` as they are as these seem intended. - unusedHaveSuffices: I cleaned up a few proofs with unused `have` or `suffices` - explicitVarsOfIff: I didn't fix any of these, because that would be a breaking change. - simpNF: I didn't fix any of these, because I think that requires knowing the intended simplification order.
38 lines
1.1 KiB
Text
38 lines
1.1 KiB
Text
/-
|
||
Copyright (c) 2017 Microsoft Corporation. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Authors: Sebastian Ullrich
|
||
|
||
The Reader monad transformer for passing immutable State.
|
||
-/
|
||
prelude
|
||
import Init.Control.Basic
|
||
import Init.Control.Id
|
||
import Init.Control.Except
|
||
|
||
namespace ReaderT
|
||
|
||
@[always_inline, inline]
|
||
protected def orElse [Alternative m] (x₁ : ReaderT ρ m α) (x₂ : Unit → ReaderT ρ m α) : ReaderT ρ m α :=
|
||
fun s => x₁ s <|> x₂ () s
|
||
|
||
@[always_inline, inline]
|
||
protected def failure [Alternative m] : ReaderT ρ m α :=
|
||
fun _ => failure
|
||
|
||
instance [Alternative m] [Monad m] : Alternative (ReaderT ρ m) where
|
||
failure := ReaderT.failure
|
||
orElse := ReaderT.orElse
|
||
|
||
end ReaderT
|
||
|
||
instance : MonadControl m (ReaderT ρ m) where
|
||
stM := id
|
||
liftWith f ctx := f fun x => x ctx
|
||
restoreM x _ := x
|
||
|
||
@[always_inline]
|
||
instance ReaderT.tryFinally [MonadFinally m] : MonadFinally (ReaderT ρ m) where
|
||
tryFinally' x h ctx := tryFinally' (x ctx) (fun a? => h a? ctx)
|
||
|
||
@[reducible] def ReaderM (ρ : Type u) := ReaderT ρ Id
|