 
 kindsEq = (k1, k2) ->
   k1 is k2 or
+    k1.from and k2.from and
     (kindsEq k1.from, k2.from) and
     (kindsEq k1.to, k2.to)
 

      malformed call, 'Missing function result'
    else
      [docs, defs] = partition isComment, defs
      if isTypeConstraint defs[0]
        [type, body, wheres...] = defs
      else
        [body, wheres...] = defs

    typeConstructorCompile
  else
    malformed expression, 'not a valid type'
  )? ctx, expression

typesCompile = (ctx, expressions) ->
  typeCompile ctx, e for e in expressions

typeConstructorCompile = (ctx, call) ->
  op = _operator call
  args = _arguments call

  if isAtom op
    op.label = 'operator'
    name = op.symbol
    compiledArgs = typesCompile ctx, args
    if name is 'Fn'
      typeFn compiledArgs...
    else
