TypeScript'te HKT Sorunu
Genel tür yapıcılarının neden zor olduğunu anlayın.
TypeScript'te HKT Sorunu, CoddyKit'te ücretsiz bir TypeScript Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, TypeScript Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. TypeScript Academy kursu toplamda 4 dersten oluşur.
Yüksek Dereceli Tür Nedir
Yüksek dereceli tür (HKT), somut bir tür üzerinde değil, bir tür oluşturucusu üzerinde soyutlama yapar: gerçek bir türe dönüşmek için bir bağımsız değişkene ihtiyaç duyan Array veya Promise gibi bir şeydir.
Array tek başına bir tür değildir. Array<string> bir türdür. Array, türler üzerinde çalışan bir işlevdir; HKT'ler bu tür işlevler üzerinde genel olmamızı sağlar.
type StringArray = Array<string>;
type NumberArray = Array<number>;
// Array by itself is a type constructor, not a typeTür Düzeylerine Kısaca Bakış
Değerlerin türleri olduğu gibi, tür oluşturucularının da tür düzeyleri vardır. number gibi sıradan bir türün tür düzeyi * değeridir. Array türünün tür düzeyi * -> * değeridir: ona bir tür verin, karşılığında bir tür alın. Bu tür yapılar üzerinde genel olmak "yüksek dereceli" olarak adlandırılır.
type ValueLike = number; // kind *
// Array needs one argument: kind * -> *
// Map needs two arguments: kind * -> * -> *Hedef: Functor<F>
HKT desteği olan dillerde, bir dizi, seçenek veya vaat olması fark etmeksizin herhangi bir kapsayıcı F ile çalışan tek bir Functor<F> soyutlaması ve tek bir map yazabilirsiniz. Tek arayüz, birçok kapsayıcı.
interface Wish_Functor<F> {
map<A, B>(fa: F<A>, f: (a: A) => B): F<B>;
}
// F<A> here is the wish - and TypeScript rejects itSorun
TypeScript, bir tür parametresinin bir bağımsız değişkene uygulanmasını desteklemez. F genel bir parametre olduğunda F<A> yazamazsınız. Derleyici "Type F is not generic" hatasını verir.
// interface Functor<F> {
// map<A, B>(fa: F<A>, f: (a: A) => B): F<B>;
// }
// Error: Type F is not genericTS Neden Bunu Desteklemiyor
TypeScript tür parametreleri birinci derecedendir: tür oluşturucuları üzerinde değil, somut türler üzerinde çalışırlar. "F tek bir tür bağımsız değişkeni alan bir şeydir" demenin bir söz dizimi yoktur. Bu nedenle F<A> derleyici için anlamsızdır.
// You can pass number, string, User as F...
// but not Array, not Promise (the constructors themselves)Somut Bir Sorun Noktası
HKT'ler olmadan her kapsayıcı için map işlevini çoğaltmanız gerekir: diziler için bir tane, seçenekler için bir tane, vaatler için bir tane. Mantık aynıdır, ancak tür sistemi bunları tek bir tür altında birleştiremez.
declare function mapArray<A, B>(fa: A[], f: (a: A) => B): B[];
declare function mapOption<A, B>(fa: A | null, f: (a: A) => B): B | null;
// Same shape, but no way to abstract over the containerİfade Etmek İstediğimiz Şey
Tek bir imza istiyoruz: A türünde bir kapsayıcı ve A -> B işlevi verildiğinde, kapsayıcı türünü koruyarak B türünde bir kapsayıcı döndürmek. Dizi dizi olarak kalır; seçenek seçenek olarak kalır.
// Wish: map<F, A, B>(fa: F<A>, f: (a: A) => B): F<B>
// where F is preserved across the callDiğer Diller
Haskell ve Scala, HKT'leri yerel olarak destekler; bu nedenle Functor, Applicative ve Monad gibi tür sınıfları bu dillerde ifade edilebilir. TypeScript'in aynı gücü yaklaşık olarak elde etmek için bir geçici çözüme ihtiyacı vardır.
// Haskell: class Functor f where fmap :: (a -> b) -> f a -> f b
// TypeScript: needs an encoding trick (next lessons)Kodlama Fikri
Standart geçici çözüm işlevsizleştirmedir: F'yi doğrudan uygulamak yerine her kapsayıcıya bir dize etiketi (URI) verir ve etiketi bir argümanla birlikte somut türe eşleyen bir kayıt defteri tutarız. Tür uygulaması bir arama işlemine dönüşür.
// Instead of F<A>, we write Kind<F, A> where F is a URI string
// and a registry resolves it to the real typeOluşturacağınız Şey
Sonraki derslerde fp-ts tarzı HKT kodlamasını adım adım oluşturacaksınız: bir URItoKind kayıt defteri, bir Kind araması ve son olarak map işlemi kayıtlı herhangi bir kapsayıcıyla çalışan genel bir Functor.
// Roadmap:
// 1. Type constructors via URI strings
// 2. Kind<F, A> resolution
// 3. Generic Functor + instancesBilmenin Neden Değerli Olduğu
Bu kodlamayı kendiniz nadiren yazarsınız; ancak fp-ts ve Effect gibi kütüphaneler buna dayanır. Bu yaklaşımı anlamak, bu kütüphanelerin türlerini okumanıza, kapsayıcılar üzerinde genel soyutlamalar yazmanıza ve tür sisteminin neleri yapıp neleri yapamayacağını kavramanıza yardımcı olur.
// Recognizing Kind<F, A> in library code is the payoffHızlı Kontrol
HKT problemini ne kadar anladığınızı sınayın.
Özet
Yüksek dereceli tür problemini gördünüz.
- HKT'ler, somut türler yerine
Arraygibi tür kurucuları üzerinde soyutlama yapar. - TypeScript parametreleri birinci derecelidir; bu nedenle
F<A>geçersizdir. - Bu durum, tek bir
mapişlemine sahip genel birFunctoryazılmasını engeller. - Çözüm, URI etiketleri ve bir kayıt defteri kullanan bir kodlamadır.
Sırada: URI dizelerini kullanarak tür kurucularını tanımlamak var.
Sıkça Sorulan Sorular
“TypeScript'te HKT Sorunu” dersi ücretsiz mi?
Evet — “TypeScript'te HKT Sorunu” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve TypeScript Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. TypeScript Academy kursu toplamda 4 dersten oluşur.
“TypeScript'te HKT Sorunu” dersinde ne öğreneceğim?
Genel tür yapıcılarının neden zor olduğunu anlayın. TypeScript Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
TypeScript Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te TypeScript Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“TypeScript'te HKT Sorunu” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu TypeScript Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her TypeScript Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- TypeScript'te HKT Sorunu
- Tür Yapıcılarını Tanımlama
- Hafif HKT Kalıbı
- Genel Functor'lar ve Eşleyiciler