[Haskell-cafe] dynamic web form generation for algebraic data types

Noon van der Silk noonsilk at gmail.com
Thu Mar 2 16:47:07 UTC 2023


> So I should re-phrase my question:
> Has anyone extended tangible values to Generic types and given them a
> modern html interface?

I think the answer is "no"; and it would be extremely great if someone did.

But I think at least part of the problem is that one is forced to marry
oneself to a particular web framework/JavaScript library, and is therefore
immediately out of date :(

Personally, back in the day I quite like the API put out by Yesod for
auto-generating forms - https://www.yesodweb.com/book/forms - but I don't
think it quite does what you want. Maybe it's a simple adaptation, though
(of course, forcing yourself to use a particular flavour of
javascript/styling approach).


On Thu, 2 Mar 2023 at 16:41, Olaf Klinke <olf at aatal-apotheke.de> wrote:

> On Thu, 2023-03-02 at 07:34 -0800, Ivan Perez wrote:
> > All of this reminds me of Conal Elliott's Tangible Values.
> >
> > http://conal.net/papers/Eros/
> >
> > (Not for web but the idea still applies.)
> >
> > Ivan
>
> Yes, the concept has been re-invented multiple times, as is the case
> with most good ideas. TVs are general enough to bolt a web interface on
> top, I guess.
>
> Seems that Conal, too, has not solved the sum type problem.
> The tangible value GADT
> https://hackage.haskell.org/package/TV-0.5.0/docs/Interface-TV-Input.html
> has a Pair constructor but not for Sum. I wonder whether there is a
> deeper categorical reason for this.
>
> So I should re-phrase my question:
> Has anyone extended tangible values to Generic types and given them a
> modern html interface?
>
> Olaf
>
> >
> > On Thu, 2 Mar 2023 at 07:02, Olaf Klinke <olf at aatal-apotheke.de> wrote:
> >
> > > On Thu, 2023-03-02 at 15:51 +0200, Georgi Lyubenov wrote:
> > > > Hey Olaf,
> > > >
> > > > This is not an answer to your question, but I was reminded of
> Grace[0],
> > > > which is a language
> > > > with a "browser"[1] that allows you to type in terms and get back
> > > > webpages based on those terms
> > > > "automagically", which sounds like exactly what you need. I don't
> know
> > > > how it's implemented, so I don't know if
> > > > it is actually relevant to you, but it is worth noting that Grace
> itself
> > > > is implemented in Haskell.
> > > >
> > > > Cheers,
> > > > Georgi
> > > >
> > > > [0] https://github.com/Gabriella439/grace
> > > > [1] https://trygrace.dev/
> > > >
> > > > On 3/2/23 12:54, Olaf Klinke wrote:
> > > > > Dear Cafe,
> > > > >
> > > > > has anyone ever attempted (and maybe succeeded) in building dynamic
> > > > > forms using one of the Haskell web frameworks (Yesod,Servant,...)?
> > > > > By "dynamic" form I mean a form that changes the number of fields
> based
> > > > > on selections the user makes in other fields of the form.
> > > > >
> > > > > For example, say one has an algebraic data type
> > > > >
> > > > >      data T = Number Int | Check Bool T
> > > > >
> > > > > A form for such a type would initially consist of radio buttons or
> a
> > > > > drop-down list with options "Number" and "Check" that lets the user
> > > > > select the constructor. When "Number" is selected, an <input
> > > > > type="number"> field is shown. When "Check" is selected, an <input
> > > > > type="checkbox"> is displayed next to another form of this kind.
> > > > >
> > > > > In the end, one would use the GHC.Generics machinery to generate
> forms
> > > > > for a wide range of algebraic data types. I've seen this in the
> Clean
> > > > > language's iTask library [1] and it's very convenient.
> > > > > Of course this would involve a lot of JavaScript like
> > > > > document.createElement() as well as book-keeping how to re-asseble
> the
> > > > > fields into a T value upon submission. At least the latter is
> already
> > > > > handled by libraries such as yesod-form.
> > > > >
> > > > > Olaf
> > > > >
> > > > > [1] https://cloogle.org/src/#itasks/iTasks/UI/Editor/Generic
> > > > > [2] https://github.com/haskell-servant/servant-swagger/issues/80
> > > > >
> > > > >
> > >
> > > Thanks for the pointer!
> > >
> > > The Grace README says under Notable Omissions:
> > >
> > > > Recursion or recursive data types
> > > >
> > > > Grace only supports two built-in recursive types, which are List and
> > > > JSON, but does not support user-defined recursion or anonymous
> > > > recursion.
> > > >
> > > > User-defined datatypes
> > > >
> > > > All data types in Grace are anonymous (e.g. anonymous records and
> > > > anonymous unions), and there is no concept of a data declaration
> > >
> > > The tutorial shows how Grace function inputs are mapped to forms, where
> > > functions with List input indeed have a form that is "dynamic" in the
> > > sense I defined. Otherwise there is only one input field per function
> > > argument. That means complex types are to be input in JSON syntax and
> > > parsed.
> > > Instead of a DSL, I'd prefer a shallow embedding into Haskell, so that
> > > one can leverage all the available machinery.
> > > Yet Grace already goes a long way towards what I am after.
> > >
> > > Olaf
> > >
> > >
> > >
> > >
> > >
> > >
> > > _______________________________________________
> > > Haskell-Cafe mailing list
> > > To (un)subscribe, modify options or view archives go to:
> > > http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> > > Only members subscribed via the mailman list are allowed to post.
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.



-- 
Noon van der Silk, ن

http://silky.github.io/

"My programming language is kindness."
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20230302/881a16aa/attachment.html>


More information about the Haskell-Cafe mailing list