[Haskell-cafe] Generic "annotations" on type definitions
Will Yager
will.yager at gmail.com
Sat Sep 10 19:20:02 UTC 2022
Doesn't this require TH? A primary constraint here is using generics only, since TH has many undesirable properties.
In the original question, I gave an unfair advantage to Rust, because it uses macros, which are similar to TH. Java's system is perhaps a fairer comparison, although it works mostly via runtime inspection.
The idea is to provide information about a type to Generic, without changing the way that type behaves for programmers.
Will
> On Sep 10, 2022, at 13:26, Olaf Klinke <olf at aatal-apotheke.de> wrote:
>
>
>>
>> Hello all,
>>
>> I was recently thinking about a generic programming application
>> (auto-generating UI code from data definitions) that would benefit from the
>> ability to "annotate" data definitions. For example, let's say you have a
>> type
>>
>> data Foo = Foo {barred :: Boolean}
>>
>> You are (auto-)generating a UI to display and manipulate `Foo`s. Perhaps
>> the generic UI code defaults to making a check-box for Boolean values, but
>> you would rather have it be a radio button. It would be advantageous to be
>> able to write something like e.g.
>>
>> data Foo = Foo {barred :: Boolean # RenderMode RadioButton}
>>
>> In many languages, you have the ability to annotate data fields in a way
>> which has no bearing whatsoever on the first-order behavior or
>> representation of the type, and is only reflected via the language's
>> generic programming API. For example, in Java, you have
>>
>> class Foo {
>> @RenderMode(RadioButton)
>> bool barred;
>> }
>>
>> And in Rust, you have
>> struct Foo {
>> #[render_mode(radio_button)]
>> barred : bool
>> }
>>
>> In Haskell, I do not believe we have any such system in place for
>> interfacing with Generics.
>>
>> The closest I am familiar with is from the optparse-generic package, where
>> you write code of the form
>>
>> data Foo w = Foo {barred :: w ::: Boolean <?> RenderMode RadioButton}
>>
>> See
>> https://hackage.haskell.org/package/optparse-generic-1.4.8/docs/Options-Generic.html#t::
>> ::
>>
>> This is basically a clever way to sort of re-create what we have available
>> in Rust or Java, using type families, but with the annoying downside that
>> it makes interacting with your type in normal code much more cumbersome,
>> and is also relatively confusing to read and write.
>>
>> Compare Rust's Clap package, which is very similar to optparse-generic, but
>> more convenient to work with because the annotations don't impact normal
>> usage of the type.
>>
>> See https://docs.rs/clap/latest/clap/#example
>>
>> Would it be technically feasible to add such a thing to GHC's Generics
>> support? I could imagine something like updating the GHC.Generics Meta
>> type's MetaCons constructor to
>>
>> MetaCons Symbol FixityI Bool *[Annotation]*
>>
>> Best,
>> Will
>
>
> Why not use special syntax in comments, like we do for Haddock,
> doctests etc.
>
> data Foo = Foo {
> barred :: Boolean -- ^ #GUI[RenderMode RadioButton]
> }
>
> There is a functional language capable of auto-generating input forms:
> Clean https://clean.cs.ru.nl/Clean with the iTask library on top. It
> can also generate forms for recursive types. The Dutch coast guard uses
> it to interactively design queries to a database of marine vessel
> movements.
> It'd be cool if Haskell's Generics also could do that.
>
> Olaf
>
More information about the Haskell-Cafe
mailing list