[Ur] Using Variant.weaken in a foldUR
Adam Chlipala
adamc at csail.mit.edu
Tue Feb 12 18:40:26 EST 2013
On 02/12/2013 06:11 PM, Patrick Hurst wrote:
> On Tue, Feb 12, 2013 at 10:03 AM, Adam Chlipala <adamc at csail.mit.edu
> <mailto:adamc at csail.mit.edu>> wrote:
>
> On 02/12/2013 12:48 AM, Patrick Hurst wrote:
>
> fun formResultToRows (fl : folder assns) (result : $(mapU
> assignmentData assns)) : list assignmentVariant =
> @foldUR [assignmentData] [fn cols => list (variant (mapU
> unit cols))]
> (fn [nam :: Name] [rest ::_] [[nam] ~ rest] res acc =>
> make [nam] () :: List.mp Variant.weaken acc
> )
> [] fl result
>
> In particular, I bet [Variant.fold] from the meta library is just
> what you need here.
>
> Also, if you are building a list of rows to insert into the
> database, it will probably work better to instead execute one SQL
> INSERT per fold iteration, so that no intermediate list needs to
> be materialized. Something like [Variant.app] would be
> appropriate for such a pattern. (Actually, it seems I only
> implemented a fancier version [Variant.appR] so far, but I bet you
> could implement the natural [Variant.app] and submit a patch with
> it. :])
>
>
> I'm not sure how [Variant.fold] helps me out here, since the thing I'm
> folding over with the [@foldUR] isn't a variant. I'm fine with
> inserting something directly into the database inside the fold as
> opposed to creating the list and then iterating over it, but again I'm
> not sure how to use [Variant.app] (what would that be? I'm not sure
> what the R suffix means exactly) to implement it since I'm not folding
> over a variant.
>
> Do you mean I want to use [Variant.app] or [Variant.fold] inside the
> [@foldUR]? If so, I'm not sure how to do so by directly inserting
> inside the fold, since the type doesn't guarantee me [nam] is in the
> relevant variant as far as I can tell, so I can't insert it.
I'm suggesting using [Variant.appR] instead of [foldUR], rather than
within the function passed to [foldUR]. (I just noticed the parameter
[result] that seems not to influence the result above, but probably is
meant to influence the result in the real code, so it seems that
actually [Variant.appR] is exactly what you need.)
The [R] suffix means that the fold is over a (value-level) _R_ecord.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20130212/29076849/attachment.html>
More information about the Ur
mailing list