If you haven't yet, it is probably a good idea to read section 6 of https://gergo.erdi.hu/papers/patsyns/2016-hs-patsyns-ext.pdf
On Wed, Oct 6, 2021 at 10:23 AM Gergő Érdi <ge...@erdi.hu> wrote: > > > I'm afraid none of this is apparent from the User Guide -- and I even > > contributed some material to the Guide, without ever understanding that. > > Before this thread, I took it that 'Required' means for building -- as in > > for smart constructors. > > No, that's not what the required/provided distinction means at all! > > You should think of both Provided and Required in the context of > matching, not in the context of building. To be able to use a pattern > synonym to match on a scrutinee of type T, not only does T have to > match the scrutinee type of the pattern synonym, but you also must > satisfy the constraints of the Required constraints -- they are > "required" to be able to use the pattern synonym. On the flipside, > once you do use the pattern synonym, on the right-hand side of your > matched clause you now get to assume the Provided constraints -- in > other words, those constraints are "provided" to you by the pattern > synonym. > > It is true that the builder could have entirely unrelated constraints > to either (as in the proposal). The current implementation basically > assumes that the Provided constraints can be provided because the > builder put them in. > > Does this make it clearer? > > On Wed, Oct 6, 2021 at 10:13 AM Anthony Clayden > <anthony.d.clay...@gmail.com> wrote: > > > > > > Thank you. Yes that proposal seems in 'the same ball park'. As Richard's > > already noted, a H98 data constructor can't _Provide_ any constraints, > > because it has no dictionaries wrapped up inside. But I'm not asking it to! > > > > The current PatSyn signatures don't distinguish between > > Required-for-building vs Required-for-matching (i.e. > > deconstructing/reformatting to the PatSyn). This seems no better than > > 'stupid theta': I'm not asking for any reformatting to pattern-match, just > > give me the darn components, they are what they are where they are. > > > > I'm afraid none of this is apparent from the User Guide -- and I even > > contributed some material to the Guide, without ever understanding that. > > Before this thread, I took it that 'Required' means for building -- as in > > for smart constructors. So PatSyns aren't really aimed to be for smart > > constructors? I should take that material out of the User Guide? > > > > > > AntC > > > > > > On Wed, 6 Oct 2021 at 10:53, Richard Eisenberg <li...@richarde.dev> wrote: > >> > >> You're right -- my apologies. Here is the accepted proposal: > >> https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0042-bidir-constr-sigs.rst > >> > >> Richard > >> > >> On Oct 5, 2021, at 12:38 PM, David Feuer <david.fe...@gmail.com> wrote: > >> > >> To be clear, the proposal to allow different constraints was accepted, but > >> integrating it into the current, incredibly complex, code was well beyond > >> the limited abilities of the one person who made an attempt. Totally > >> severing pattern synonyms from constructor synonyms (giving them separate > >> namespaces) would be a much simpler design. > >> > >> On Tue, Oct 5, 2021, 12:33 PM Richard Eisenberg <li...@richarde.dev> wrote: > >>> > >>> > >>> > >>> On Oct 3, 2021, at 5:38 AM, Anthony Clayden <anthony.d.clay...@gmail.com> > >>> wrote: > >>> > >>> > pattern SmartConstr :: Ord a => () => ... > >>> > >>> Seems to mean: > >>> > >>> * Required constraint is Ord a -- fine, for building > >>> > >>> > >>> Yes. > >>> > >>> * Provided constraint is Ord a -- why? for matching/consuming > >>> > >>> > >>> No. Your signature specified that there are no provided constraints: > >>> that's your (). > >>> > >>> > >>> I'm using `SmartConstr` with some logic inside it to validate/build a > >>> well-behaved data structure. But this is an ordinary H98 datatype, not a > >>> GADT. > >>> > >>> > >>> I believe there is no way to have provided constraints in Haskell98. You > >>> would need either GADTs or higher-rank types. > >>> > >>> > >>> This feels a lot like one of the things that's wrong with 'stupid theta' > >>> datatype contexts. > >>> > >>> > >>> You're onto something here. Required constraints are very much like the > >>> stupid theta datatype contexts. But, unlike the stupid thetas, required > >>> constraints are sometimes useful: they might be needed in order to, say, > >>> call a function in a view pattern. > >>> > >>> For example: > >>> > >>> checkLT5AndReturn :: (Ord a, Num a) => a -> (Bool, a) > >>> checkLT5AndReturn x = (x < 5, x) > >>> > >>> pattern LessThan5 :: (Ord a, Num a) => a -> a > >>> pattern LessThan5 x <- ( checkLT5AndReturn -> (True, x) ) > >>> > >>> > >>> My view pattern requires (Ord a, Num a), and so I must declare these as > >>> required constraints in the pattern synonym type. Because vanilla data > >>> constructors never do computation, any required constraints for data > >>> constructors are always useless. > >>> > >>> > >>> For definiteness, the use case is a underlying non-GADT constructor for a > >>> BST > >>> > >>> > Node :: Tree a -> a -> Tree a -> Tree a > >>> > > >>> > pattern SmartNode :: Ord a => () => Tree a -> a -> Tree a -> Tree a > >>> > >>> with the usual semantics that the left Tree holds elements less than this > >>> node. Note it's the same `a` with the same `Ord a` 'all the way down' the > >>> Tree. > >>> > >>> > >>> Does SmartNode need Ord a to match? Or just to produce a node? It seems > >>> that Ord a is used only for production, not for matching. This suggests > >>> that you want a separate smartNode function (not a pattern synonym) and > >>> to have no constraints on the pattern synonym, which can be > >>> unidirectional (that is, work only as a pattern, not as an expression). > >>> > >>> It has been mooted to allow pattern synonyms to have two types: one when > >>> used as a pattern and a different one when used as an expression. That > >>> might work for you here: you want SmartNode to have no constraints as a > >>> pattern, but an Ord a constraint as an expression. At the time, the > >>> design with two types was considered too complicated and abandoned. > >>> > >>> Does this help? > >>> > >>> Richard > >>> _______________________________________________ > >>> Glasgow-haskell-users mailing list > >>> Glasgow-haskell-users@haskell.org > >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users > >> > >> > > _______________________________________________ > > Glasgow-haskell-users mailing list > > Glasgow-haskell-users@haskell.org > > http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users