E04050: type must be a simple aggregate/list/dict

Category: E04xxx Reference checks · Reported in phase: EXPLICIT_TYPE_SYMBOL_DEFINITION · Classification: TYPE_MUST_BE_SIMPLE · All error codes

What went wrong

Type inference cannot resolve the type from a complex expression. When using '<-' for declaration, the compiler needs to infer the type BEFORE full expression processing. Complex expressions require explicit typing.

Worked examples

Compilable examples demonstrating this error and the correct fix:

  • ek9 -q 104 (Why does EK9 require explicit constructors for uninitiali...)

What can be inferred

  • Simple construction: x <- SomeType()
  • Parameterized types: x <- List() of String
  • List literals: x <- [1, 2, 3]
  • Dict literals: x <- {"key": "value"}

What cannot be inferred

  • Arithmetic: x <- getValue() + 10
  • Method chains: x <- obj.process().transform()
  • Complex expressions: x <- condition ? valueA : valueB

How to fix it

Use explicit type declaration for complex expressions:

variableName as Type: complexExpression

Rationale

Phase 2 must resolve all property types BEFORE Phase 3 expression processing. Complex expressions require the full type system, creating a circular dependency. Explicit typing breaks this cycle.

See also

  • E04060: not an aggregate type

Examples

Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.

Fails with E04050: type must be a simple aggregate/list/dict

#!ek9
defines module error.e04050.bad

  defines function

    firstName()
      //A method call cannot give '<-' its type: the compiler infers it before methods are resolved
      <- name <- List("Steve").getOrDefault(0, "")

Fixed: Declare the type, then assign the expression - or infer only from a literal or constructor

#!ek9
defines module error.e04050.good

  defines function

    firstName()
      <- name as String: List("Steve").getOrDefault(0, "")

    emptyCount()
      <- count <- Integer()

    names()
      <- rtn <- ["Steve", "Stephen", "Steven"]

Questions and answers

These Q&A entries show E04050 and its fix: