Skip to content
  • Ziyang Liu's avatar
    e2ae9518
    Allow `let` just before pure/return in ApplicativeDo · e2ae9518
    Ziyang Liu authored and Marge Bot's avatar Marge Bot committed
    The following is currently rejected:
    
    ```haskell
    -- F is an Applicative but not a Monad
    x :: F (Int, Int)
    x = do
      a <- pure 0
      let b = 1
      pure (a, b)
    ```
    
    This has bitten me multiple times. This MR contains a simple fix:
    only allow a "let only" segment to be merged with the next (and not
    the previous) segment. As a result, when the last one or more
    statements before pure/return are `LetStmt`s, there will be one
    more segment containing only those `LetStmt`s.
    
    Note that if the `let` statement mentions a name bound previously, then
    the program is still rejected, for example
    
    ```haskell
    x = do
      a <- pure 0
      let b = a + 1
      pure (a, b)
    ```
    
    or the example in #18559. To support this would require a more
    complex approach, but this is IME much less common than the
    previous case.
    e2ae9518
    Allow `let` just before pure/return in ApplicativeDo
    Ziyang Liu authored and Marge Bot's avatar Marge Bot committed
    The following is currently rejected:
    
    ```haskell
    -- F is an Applicative but not a Monad
    x :: F (Int, Int)
    x = do
      a <- pure 0
      let b = 1
      pure (a, b)
    ```
    
    This has bitten me multiple times. This MR contains a simple fix:
    only allow a "let only" segment to be merged with the next (and not
    the previous) segment. As a result, when the last one or more
    statements before pure/return are `LetStmt`s, there will be one
    more segment containing only those `LetStmt`s.
    
    Note that if the `let` statement mentions a name bound previously, then
    the program is still rejected, for example
    
    ```haskell
    x = do
      a <- pure 0
      let b = a + 1
      pure (a, b)
    ```
    
    or the example in #18559. To support this would require a more
    complex approach, but this is IME much less common than the
    previous case.
Loading