1unitedpower: Informatik zum Dienstag

Beitrag lesen

Hallo 1unitedpower,

by the way braucht man binaryLength gar nicht. Das verleitet nur zum cheaten. Man muss nur binaryToNumber etwas umgestalten:

function binaryToNumber(n : BNat) : number {
  return b2n(0, n);

  function b2n(val: number, n: BNat) : number {
    if (n.tag === 'zero') return val;
    return b2n(2*val + (n.tag === 'B1' ? 1 : 0), n.pred);
  }
}

Sehr gut, gefällt mir wesentlich besser als meine eigene Implementierung. Du sparst nicht nur die wiederholte Berechnung der Länge, sondern hast auch noch einen tail-rekursiven Ansatz und sparst darurch Platz auf dem Callstack.

Die Abfrage n.tag === 'zero' statt n === zero hilft TypeScript bei der korrekten Typdiskriminierung. Ich könnte sonst n.pred nicht verwenden.

Seltsam, dass die Typ-Verfeinerung in einem Fall klappt und im anderen nicht.

Warum hast Du eigentlich Zero, U0, B0 und B1 als interface definiert und nicht als type? Ich habe ja von TypeScript fast gar keine Ahnung…

Da habe ich mir nichts bei gedacht, für die Vorlage ist das wohl äquivalent. Eine type-Deklaration wäre wohl sogar etwas schöner, weil intuitiver, gewesen.