<div dir="ltr">I mentioned earlier wanting to avoid modules for this, and hoping for something like the SML syntax that Richard mentioned, even making my own equivalent syntactic proposal<div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>{f = ...; g = ...} where h = ...</div></blockquote>which looks in line with current Haskell conventions. Given the existing options, however, I would probably go with a top-level pair definition:</div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>(f,g) = (..., ...) where h = ...</div></blockquote>or</div><div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div>(f,g) = let f' = ...; g' = ...' ; h = ... in (f',g')</div></blockquote>as mentioned by Jeff. Thanks to all who contributed!</div><div><br></div><div>--Todd</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 28, 2023 at 12:40 AM Daniel Casanueva <<a href="mailto:daniel.casanueva@proton.me">daniel.casanueva@proton.me</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I hope I am not misunderstanding the question, but if you want to define f, g and h, but only export f and g, this is what you would do in Haskell:<br>
<br>
module Foo.Bar (f, g) where<br>
<br>
f = ...<br>
g = ...<br>
h = ...<br>
<br>
The module header determines what gets exported.<br>
<br>
On Tuesday, November 28th, 2023 at 07:35, Richard O'Keefe <<a href="mailto:raoknz@gmail.com" target="_blank">raoknz@gmail.com</a>> wrote:<br>
<br>
<br>
> <br>
> <br>
> SML has<br>
> local<br>
> declarations<br>
> in<br>
> declarations<br>
> end<br>
> and there is no fundamental reason why Haskell couldn't.<br>
> Is there some reason why you cannot put f g and h in a module and just<br>
> export f and g?<br>
> <br>
> On Thu, 23 Nov 2023 at 16:42, Todd Wilson <a href="mailto:twilson@csufresno.edu" target="_blank">twilson@csufresno.edu</a> wrote:<br>
> <br>
> > It seems (surprisingly to me) that such pattern matches are allowed at the top level, so that would simplify my kludge a bit by skipping the definition of fg. But is using pairs (or the equivalent) in this way the only solution? I was hoping that there might be some kind of top-level definition syntax like<br>
> > <br>
> > {f .. = ... ; g .. = ...} where h .. = ...<br>
> > <br>
> > that would correctly capture the scoping I'm looking for.<br>
> > <br>
> > --Todd<br>
> > <br>
> > On Wed, Nov 22, 2023 at 5:43 PM Jeff Clites <a href="mailto:jclites@mac.com" target="_blank">jclites@mac.com</a> wrote:<br>
> > <br>
> > > Can you do:<br>
> > > <br>
> > > (f, g) = let f’ = … in (f’, g’)<br>
> > > <br>
> > > or is a pattern match not allowed at top level?<br>
> > > <br>
> > > Jeff<br>
> > > <br>
> > > On Nov 22, 2023, at 4:40 PM, Todd Wilson <a href="mailto:twilson@csufresno.edu" target="_blank">twilson@csufresno.edu</a> wrote:<br>
> > > <br>
> > > Hello, Cafe:<br>
> > > <br>
> > > Is there a preferred way to define two top-level mutually recursive functions, f and g, that both use a common local function h such that h is (1) only defined once and (2) does not escape the scope of f and g? I suppose it could be done like this:<br>
> > > <br>
> > > fg = let f ... = ... f,g,h ...<br>
> > > g ... = ... f,g,h ...<br>
> > > h ... = ... h ...<br>
> > > in (f,g)<br>
> > > f = fst fg<br>
> > > g = snd fg<br>
> > > <br>
> > > but is there something more elegant than this that I'm not seeing?<br>
> > > <br>
> > > Todd Wilson<br>
> > > _______________________________________________<br>
> > > Haskell-Cafe mailing list<br>
> > > To (un)subscribe, modify options or view archives go to:<br>
> > > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
> > > Only members subscribed via the mailman list are allowed to post.<br>
> > <br>
> > _______________________________________________<br>
> > Haskell-Cafe mailing list<br>
> > To (un)subscribe, modify options or view archives go to:<br>
> > <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
> > Only members subscribed via the mailman list are allowed to post.<br>
> <br>
> _______________________________________________<br>
> Haskell-Cafe mailing list<br>
> To (un)subscribe, modify options or view archives go to:<br>
> <a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
> Only members subscribed via the mailman list are allowed to post.<br>
</blockquote></div>