CodeBlanks Logo Icon CodeBlanks

Exhaustive eval

Exhaustive check ile değerlendirme fonksiyonu yazarsın.

Exhaustive eval

Değerlendirme fonksiyonu, tüm düğüm türlerini kapsayan bir switch ile yazılır. assertNever yardımcısı ile default dalı, eksik case varsa derleme hatası verir. Bu, yeni düğüm eklendiğinde tüm eval fonksiyonlarının güncellenmesini garanti eder.

function assertNever(x: never): never {
  throw new Error("Unexpected: " + x);
}

function evalNode(n: Node): number | string {
  switch (n.kind) {
    case "number": return n.value;
    case "string": return n.value;
    case "add": return "(add)";
    default: return assertNever(n);
  }
}

assertNever ile güvenlik

assertNever ile default dalı, switch'in tüm durumları kapsadığını garanti eder. Yeni bir düğüm türü eklendiğinde, evalNode fonksiyonu artık tükenmiş değildir; default dalındaki n never olmaz ve assertNever(n) çağrısı derleme hatası verir.

function assertNever(x: never): never {
  throw new Error("Unexpected");
}

function evalNode(n: Node): string {
  switch (n.kind) {
    case "number": return String(n.value);
    case "string": return n.value;
    case "add": return evalNode(n.left) + evalNode(n.right);
    default: return assertNever(n);
  }
}

Uygulama Exhaustive eval yaz

assertNever(x: never): never fonksiyonunu tanımla (içinde throw new Error("Unexpected") olsun). Node discriminated union türünü tanımla ("number" (value: number), "string" (value: string), "add" (left: Node, right: Node)). evalNode(n: Node): string fonksiyonunu switch (n.kind) ile yaz: number için String(n.value), string için n.value, add için evalNode(n.left) + evalNode(n.right), default için return assertNever(n); yaz. console.log(evalNode({ kind: "add", left: { kind: "number", value: 1 }, right: { kind: "string", value: "x" } })) ile sonucu yazdır.

Başlangıç kodu

index.ts
// assertNever fonksiyonunu tanımla (never parametre, throw ile)

// Node discriminated union türünü tanımla (kind: number, string, add)

// evalNode fonksiyonunu switch ile yaz, default'ta assertNever çağır

// evalNode ile add düğümünü değerlendir ve yazdır

Örnek çözüm

index.ts
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

type Node =
  | { kind: "number"; value: number }
  | { kind: "string"; value: string }
  | { kind: "add"; left: Node; right: Node };

function evalNode(n: Node): string {
  switch (n.kind) {
    case "number":
      return String(n.value);
    case "string":
      return n.value;
    case "add":
      return evalNode(n.left) + evalNode(n.right);
    default:
      return assertNever(n);
  }
}

console.log(evalNode({ kind: "add", left: { kind: "number", value: 1 }, right: { kind: "string", value: "x" } }));

Beklenen çıktı

1x

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Exhaustive eval fonksiyonunda assertNever ne sağlar?

  • Çalışma zamanı hatası
  • Yeni düğüm eklendiğinde eksik case'i derleyici bildirir Doğru cevap
  • Otomatik case ekleme
  • Daha hızlı yürütme

Açıklama: assertNever ile default dalı, switch'in tüm durumları kapsadığını garanti eder; yeni düğüm eklenince eksik case'ler derleme hatası verir.

2 assertNever default dalında

Soru
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

function evalNode(n: Node): string {
  switch (n.kind) {
    case "number": return String(n.value);
    case "string": return n.value;
    case "add": return evalNode(n.left) + evalNode(n.right);
    default:
      return ____;
  }
}
Cevap
function assertNever(x: never): never {
  throw new Error("Unexpected");
}

function evalNode(n: Node): string {
  switch (n.kind) {
    case "number": return String(n.value);
    case "string": return n.value;
    case "add": return evalNode(n.left) + evalNode(n.right);
    default:
      return assertNever(n);
  }
}

Açıklama: default dalında assertNever(n) çağrısı, n never değilse (yani bir case eksikse) derleme hatası verir; bu exhaustive check sağlar.

3 Exhaustive eval parçaları

Kavram Anlamı
assertNever(n) n never değilse hata
default dalı tüm case'ler sonrası kalan
Yeni düğüm eklenince eksik case derleyicide hata
switch (n.kind) tüm düğüm türlerini kapsar

İleri seviye bölümündeki tüm dersler