Skip to content

Simpler Tier 1 tactics for case splits #3525

Open
@ejconlon

Description

@ejconlon

Is your enhancement request related to a problem? Please describe.

First, let me say that I appreciate all of the hard work the maintainers of HLS and plugins do and have done - you guys are superheroes!

It looks like hls-tactics-plugin has been disabled due to some conflict with GHC 9.2 that has not been resolved. This means that features like case splitting are no longer available in HLS. I am probably not along in having become very used to this feature, as it allows one to destruct large sum types quickly. In my opinion, this tactic should be a Tier 1 feature of HLS, at least for "simple" types (ADTs, maybe not GADTs). It would be great to see it re-enabled, but it seems like the machinery of the tactics plugin is a bit daunting for new contributors! It has support for type-directed program synthesis that may not be needed for simple tactics such as destruct (but please correct me if I am wrong).

Describe the solution you'd like

I propose a separate plugin that supports the simplest tactics like destruct and intros, and only on simple types. Ideally we would get it into a state where enough people would feel comfortable with maintenance that it could be a Tier 1 plugin. Doing this might be a good opportunity to pull out some reusable functionality that can be shared between tactics implementations and other plugins. (For example, right now tactics relies on refactor for printing and insertion.) Such reusable functionality might include:

  • Identifying whether a code action may have a relevant hole (for example, when invoking quick-fix on a var on the LHS of a function definition with a hole in the body on the RHS).
  • Identifying the type of the var under the point, or identifying the type of the relevant hole.
  • Classifying which types can be easily destructed.
  • Generating fresh (and relevant) names for pattern vars and named holes.
  • Generating patterns from easily-destructible types
  • Inserting generated syntax into the document.

(I know where some of this functionality is, but it's not easy to find and isolate! Documentation may help.)

The tactics plugin could then be focused on more advanced program synthesis.

Describe alternatives you've considered

The alternative is the status quo, where tactics may disappear in HLS releases as it is not Tier 1. Additional maintainers could change that, though. Improved documentation of the tactics plugin would also help.

Additional context

I am happy to contribute what I can, but I definitely need some help. I am also happy to try to break down and organize tasks.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions