Introduce flat unparameterized ADTs for script requirements
The previous ScriptRequirements GADT and associated type families
(OptionalDatum, MintPolicyId) forced callers to pattern match on
nullary constructors like NoPolicyId and NoScriptDatumAllowed that
carry no information. For example, in the old Certificate/Read.hs:
PlutusRefScriptCliArgs
refInput
(AnySLanguage lang)
Exp.NoScriptDatumAllowed -- meaningless
NoPolicyId -- meaningless
redeemerFile
execUnits
These constructors exist only to fill slots demanded by the type
families in contexts where those fields don't apply. This is an
inherent cost of a single GADT polymorphic over all script contexts.
Replace with flat, context-specific ADTs that simply omit fields
irrelevant to their context:
- PlutusSpendingScriptRequirements: carries an optional datum
- PlutusMintingScriptRequirements: carries a PolicyId
- PlutusNonAssetScriptRequirements: needs neither (certificates,
voting, withdrawals, proposals)