From: john s. <sk...@us...> - 2010-11-19 13:42:35
|
On 20/11/2010, at 12:33 AM, john skaller wrote: > > On 20/11/2010, at 12:24 AM, john skaller wrote: > >> >> CLIENT ERROR >> [bind_exe: fun_return ] return of index_8651<8651>[<T8648>, <T8649>]: >> fun return type: >> list[<T8648>] -> list[<T8649>] >> must have same type as return expression: >> list[<T8648>] -> (list[<T8648>] -> list[<T8649>]) >> In build/release-optimized/lib/std/list.flx: line 123, cols 1 to 3 >> 122: return aux x Empty[U]; >> 123: } >> *** >> 124: >> >> Clearly the same bug .. why can't I see what it is? > > > > Hmmm .... Here's the trick .. if a function f has index i, its > return type is initially set to > > arg -> Ti > > where Ti is a type variable. This allows forming a term > based on the return type, and then solving for the > type variables of several function at once (think mutually > recursive functions). > > This is done by "do_unify". The variables are stored in state.syms.varmap. > > They're both hashtables.. > > > type typevarmap_t = (Flx_types.bid_t, Flx_btype.t) Hashtbl.t > ticache : (bid_t, Flx_btype.t) Hashtbl.t; > > > OMG .. same type, I just bet I mixed them up! I just became a fan of labelled arguments! (** Create the state needed for lookup. *) let make_lookup_state print_flag counter varmap ticache sym_table = { let lookup_state = Flx_lookup.make_lookup_state syms.Flx_mtypes2.compiler_options.Flx_mtypes2.print_flag syms.Flx_mtypes2.counter syms.Flx_mtypes2.ticache syms.Flx_mtypes2.varmap sym_table in :) -- john skaller sk...@us... |