Skip to content

Indentation works differently for multi-way if than for guards when using comma-separate view patterns

When trying to parse the following piece of code:

{-# LANGUAGE MultiWayIf #-}
module Test where

data AB = A | B

aAndB :: AB -> AB -> Bool
aAndB ab1 ab2 =
  if | A <- ab1
     , B <- ab2  -> True
     | otherwise -> False

I get the following error

test.hs:9:6: error:
    parse error (possibly incorrect indentation or mismatched brackets)

This is as currently is inconsistent with how guards are parsed, e.g.:

aAndB2 :: AB -> AB -> Bool
aAndB2 ab1 ab2 | A <- ab1
               , B <- ab2 = True
               | otherwise = False

works perfectly fine.

Note, that if I indent the comma a bit in aAndB, the following will parse correctly:

aAndB :: AB -> AB -> Bool
aAndB ab1 ab2 =
  if | A <- ab1
      , B <- ab2  -> True
     | otherwise -> False

Of course, this is far from a major issue, but I thought it would probably be beneficial to report the issue nonetheless. It also looks likely less neat with the comma indented.

Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority lowest
Resolution Unresolved
Component Compiler (Parser)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information