-
Notifications
You must be signed in to change notification settings - Fork 85
Description
Accidentially writing <$> in monadic semantic actions gives complete incomprehensible type errors on the generated Haskell code.
Example from Agda code base (details do not matter):
DomainFreeBindingAbsurd :: { Either (List1 (NamedArg Binder)) (List1 Expr)}
DomainFreeBindingAbsurd
: ...
| '{{' Attributes1 CommaBIds DoubleCloseBrace
{% Left <$> applyAttributes $2 (makeInstance defaultArgInfo) $3 }I was faced with this error (details do not matter):
agda/dist-newstyle/build/aarch64-osx/ghc-9.10.1/Agda-2.8.0/build/Agda/Syntax/Parser/Parser.hs:5447:11: error: [GHC-83865]
• Couldn't match expected type ‘Parser
(Either (List1 (NamedArg Binder)) (List1 Expr))’
with actual type ‘Bool’
• In the expression:
Left
< happy_var_4
applyAttributes happy_var_2 (makeInstance defaultArgInfo)
happy_var_3
In a case alternative:
(HappyWrap22 happy_var_4)
-> (Left
< happy_var_4
applyAttributes happy_var_2 (makeInstance defaultArgInfo)
happy_var_3)
In the expression:
case happyOut22 happy_x_4 of
(HappyWrap22 happy_var_4)
-> (Left
< happy_var_4
applyAttributes happy_var_2 (makeInstance defaultArgInfo)
happy_var_3)
|
5447 | ( Left <happy_var_4 applyAttributes happy_var_2 (makeInstance defaultArgInfo) happy_var_3)}}})
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
agda/dist-newstyle/build/aarch64-osx/ghc-9.10.1/Agda-2.8.0/build/Agda/Syntax/Parser/Parser.hs:5447:17: error: [GHC-83865]
• Couldn't match expected type: (List1 Attr
-> ArgInfo
-> f0 (NamedArg Binder)
-> Parser (f0 (NamedArg Binder)))
-> List1 Attr
-> ArgInfo
-> List1 (NamedArg Binder)
-> a0
-> Either a0 b0
with actual type: Range' SrcFile
• The function ‘happy_var_4’ is applied to four visible arguments,
but its type ‘Range’ has none
In the second argument of ‘(<)’, namely
‘happy_var_4
applyAttributes happy_var_2 (makeInstance defaultArgInfo)
happy_var_3’
In the expression:
Left
< happy_var_4
applyAttributes happy_var_2 (makeInstance defaultArgInfo)
happy_var_3
|
5447 | ( Left <happy_var_4 applyAttributes happy_var_2 (makeInstance defaultArgInfo) happy_var_3)}}})
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ideally one would allow <$> in the semantic action code.
However, since $> is a code used by happy for the last variable, and Haskell does not require whitespace around operators, <$> actually can be interpreted by Happy. In my example, this expands to the nonsense:
Left < $3 applyAttributes $2 (makeInstance defaultArgInfo) $3
So the door to allowing <$> is closed.
I think however a warning would be in order.
The probability for intentionally writing <$> in the meaning that happy reads into it is minuscule, so the vast majority of occurrences <$> should be by accident.
Happy should warn that there is a chance of confusion.
Should it be a false alert, it can be fixed by adding a space (< $>) or turning off the warning.