Arity: exprArity invariant are not upheld
Invariant (2) of Note [exprArity invariant]
says
(2) exprArity e <= typeArity (exprType e)
And similarly, even after the refactoring and renaming to Note [typeArity invariants]
proposed in !5658 (closed) it says
(1) In any binding x = e,
idArity f <= typeArity (idType f)
Both invariants are not upheld for the following program:
{-# OPTIONS_GHC -O2 -fforce-recomp #-}
module Lib where
newtype N = N (Int -> Int -> Int)
plusInt :: N
plusInt = N (+)
In -ddump-simpl
I see
-- RHS size: {terms: 1, types: 0, coercions: 2, joins: 0/0}
plusInt :: N
[GblId,
Arity=2,
Str=<1!L><1!L>,
Cpr=1,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=0,unsat_ok=True,boring_ok=True)}]
plusInt
= GHC.Num.$fNumInt_$c+
`cast` (Sym (Lib.N:N[0]) :: (Int -> Int -> Int) ~R# N)
Note that plusInt
gets idArity 2, which is more than 0, the typeArity of N
. So the invariant is not upheld.
I think the status quo is fine, but I'm not sure what invariant that is based on. It seems idArity
ignores intermittent casts and I'm completely fine with that.