[Ur] sourcing a record

Gergely Buday gbuday at gmail.com
Tue Sep 27 13:35:45 EDT 2011


I stepped back to solve a simpler problem: an identity function on
records using fold.

fun identity [ r ::: {Type} ] (record : $r) : ($r) =
    fold [ fn t => $t ] (fn [nm ::_]  [ v::_] [r::_]  [[nm]~r] v => fn
acc => ({nm = v} ++ acc )) () record

but the compiler complains that I have too much arguments for the step function:

cellPull.ur:6:24-6:97: Unification failure
Expression:
fn nm :: Name =>
 fn v :: Type =>
  fn r :: {Type} =>
   fn v : $r => fn acc : $<UNIF:D::{Type}> => {nm = v} ++ acc
  Have con:
nm :: Name ->
 v :: Type ->
  r :: {Type} ->
   [[nm = ()] ~ r] =>
    ($r -> ($<UNIF:D::{Type}> -> $(([nm = $r]) ++ <UNIF:D::{Type}>)))
  Need con:
nm :: Name ->
 v :: Type ->
  r :: {Type} -> [[nm = ()] ~ r] => ($r -> $(([nm = v]) ++ r))
Incompatible constructors
Con 1:
($<UNIF:D::{Type}> -> $(([UNBOUND_REL2 = $r]) ++ <UNIF:D::{Type}>))
Con 2:  $(([UNBOUND_REL2 = UNBOUND_REL1]) ++ r)
cellPull.ur:6:4-6:100: Unification failure
Expression:
fold[[Type]] [(fn t :: {Type} => $t)]
 (fn nm :: Name =>
   fn v :: Type =>
    fn r :: {Type} =>
     fn v : $r => fn acc : $<UNIF:D::{Type}> => {nm = v} ++ acc) {}
 [<UNIF:I::{Type}>] _
  Have con:  $<UNIF:I::{Type}>
  Need con:  (<UNIF:J::Type> -> <UNIF:K::Type>)
Incompatible constructors
Con 1:  $<UNIF:I::{Type}>
Con 2:  (<UNIF:J::Type> -> <UNIF:K::Type>)

Why does it tell this? A proper step function should take the value
and the accumulator as arguments, but the "need con" section tells
that fold does not expect that. Or am I misunderstanding the error
message?

- Gergely



More information about the Ur mailing list