Remix.run Logo
stuartjohnson12 3 days ago

Algebraic types aren't scary at all. See:

  type CollatzConjectureIsTrue<
    N extends any[] = [unknown],
    M = "∀",
    A extends any[] = []
  > =
  M extends "odd"   ? (N extends [any, any, ...infer R] ? CollatzConjectureIsTrue<R,"odd"> : N extends [any] ? true : false)
  : M extends "half"  ? (N extends [any, any, ...infer R] ? CollatzConjectureIsTrue<R,"half",[unknown,...A]> : A)
  : M extends "3n1"   ? [unknown, ...N, ...N, ...N]
  : M extends "next"  ? (CollatzConjectureIsTrue<N,"odd"> extends true ? CollatzConjectureIsTrue<N,"3n1"> : CollatzConjectureIsTrue<N,"half">)
  : M extends "term"  ? (N extends [unknown] ? true : CollatzConjectureIsTrue<CollatzConjectureIsTrue<N,"next">,"term">)
  : (CollatzConjectureIsTrue<N,"term"> extends true ? CollatzConjectureIsTrue<[unknown,...N]> : false);
mrkeen 3 days ago | parent | next [-]

any, extends, unknown and infer.

What algebraic operations do they correspond to?

wk_end 3 days ago | parent | prev [-]

Where are the sum and product types in this, exactly?