[Ur] Minimal modification to Crud1: Moved a `@foldR` call *before* the `return`, no longer compiles.

Stefan Scott stefanscottalexx at gmail.com
Mon Aug 31 12:19:55 EDT 2015


[Note: The following message can also be seen as a README on GitHub - with
better formatting: https://github.com/StefanScott/UrWeb-Crud1-move-foldR ]

I am attempting make a minimal modification to the Crud1 demo, by moving
the call to `@foldR` in `list()` to *before* the `return` statement.

The modified version now gives a kind unification error, apparently
involving the 2nd argument to `@foldr` - `[ fn cols => xml form [] (map snd
cols) ]`.

I am trying to figure out how such a minimal modification could result in a
compile error.

The "diff" between the "before" and "after" can be seen at this link - also
excerpted here below:

https://github.com/StefanScott/UrWeb-Crud1-move-foldR/commit/04ca85962a5c95e8144c6e2a29df729d631b6187#diff-74e1ef1a69438025793099ad624ad8bcR63

BEFORE:

  return <xml> (* <= the `return` *)
  ...
  {@foldR  (* <= call to `@foldR`, will be moved *above* the `return` *)
      [ colMeta ]
      [ fn cols => xml form [] (map snd cols) ]
      ( fn [nm :: Name] [t ::_] [rest ::_] [[nm] ~ rest] (col : colMeta t)
acc =>
        <xml>
          <li> {cdata col.Nam}: {col.Widget [nm]}</li>
          {useMore acc}
        </xml> )
      <xml/>
      M.fl
      M.cols}
  ...
  </xml>

AFTER:

formFields <- @foldR (* <= call to `@foldR`, now moved *above* the `return`
*)
  [ colMeta ]
  [ fn cols => xml form [] (map snd cols) ]
  ( fn [nm :: Name] [t ::_] [rest ::_] [[nm] ~ rest] (col : colMeta t) acc
=>
    <xml>
      <li> {cdata col.Nam}: {col.Widget [nm]}</li>
      {useMore acc}
    </xml> )
  <xml/>
  M.fl
  M.cols;
  return <xml> (* <= the `return` *)
  ...
  {formFields} (* <= call to `@foldR` was originally here *)
  ...
  </xml>

I created a GitHub with just 2 commits, to illustrate the modification:

  - commit 0: the original Crud1 (simplified to only do SELECT and INSERT);

  - commit 1: the modified Crud1 - now, in function `list()`, the call to
`@foldR` which computes the form fields has been moved to *before* the
`return`. This gives following compile error:

https://github.com/StefanScott/UrWeb-Crud1-move-foldR/blob/master/ERR.001.crudWidgetTxn1.ur

The modified version gives a kind unification failure:

  Have con:

  xml ([Dyn = (), Body = (), Form = ()]) ([])
   (map (fn t :: (Type * Type) => t.2) M.cols)

  Need con:

  <UNIF:U408::Type -> Type> <UNIF:U409::Type>

  Kind unification failure

  Have:  {Type} -> Type
  Need:  Type -> Type

This appears to involve the second argument to `@foldR`, which is:

  [ fn cols => xml form [] (map snd cols) ]

I thought that merely moving a chunk of code before a `return` statement
like this wouldn't change much, so I don't understand what might be causing
this kind unification failure in the modified version.

Thanks for any help!

###
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.impredicative.com/pipermail/ur/attachments/20150831/3e43ce8c/attachment.html>


More information about the Ur mailing list