Would it not be possible to have anonymous union types that convert to a 
broader union type automatically?

This would avoid partially instanciated enum while allowing the same kind of 
uses, no?
    
    
    template makeError(code: int): enum of Le: string =
      result.Le = codeToString(code)
    
    proc myFunction(): Either[string, int] =
      let code = readFile(myVar)
      if isError(code):
        return makeError(code)
     
     return Either.Ri(myVar.toInt())
    
    
    Run

Also, why not completely anonymous union types based on the different branch 
types?
    
    
    type ErrorString = string
    
    template makeError(code: int): ErrorString =
      result = codeToString(code)
    
    proc myFunction(): enum[ErrorString, int] =
      let code = readFile(myVar)
      if isError(code):
        return makeError(code)
     
     return myVar.toInt()
    
    
    Run

The discriminant would then just be the type information.

Reply via email to