Kimse soruyu cevaplamadığından, kendim bir deneyeceğim. Biraz felsefi olmak zorunda kalacağım.
Genel programlama, tip bilgisi kaybı olmadan (nesneye yönelik değer polimorfizmi ile ne olur) benzer türler üzerinde soyutlama ile ilgilidir. Bunu yapmak için, türlerin kullanabileceğiniz bir tür arabirimi (OO terimi değil, bir dizi işlem) paylaşması gerekir.
Nesneye yönelik dillerde, türler sınıflar sayesinde bir arayüzü tatmin eder. Her sınıfın türünün bir parçası olarak tanımlanan kendi arayüzü vardır. Tüm sınıflar List<T>
aynı arabirimi paylaştığından hangisini T
seçerseniz seçin işe yarayan bir kod yazabilirsiniz . Bir arabirim dayatmanın bir başka yolu da miras kısıtlamasıdır ve ikisi farklı görünse de, bunu düşünürseniz benzerdirler.
Çoğu nesne yönelimli dilde, List<>
kendi içinde uygun bir tür değildir. Herhangi bir yöntemi yoktur ve bu nedenle arayüzü yoktur. Sadece List<T>
bu şeyler var. Esasen, daha teknik terimlerle, anlamlı bir şekilde soyutlayabileceğiniz türler türüne sahip olanlardır *
. Nesneye yönelik bir dünyada daha yüksek türlerden yararlanmak için, tür kısıtlamalarını bu kısıtlama ile tutarlı bir şekilde ifade etmelisiniz.
Örneğin, yorumlarda belirtildiği gibi, biz görüntüleyebilir Option<>
ve List<>
bir işlevi varsa, "Haritalanabilir" olarak, bir anlamda, bir dönüştürmek olabilir Option<T>
bir içine Option<S>
veya List<T>
bir içine List<S>
. Sınıfların doğrudan daha üst düzey türler üzerinde soyutlamak için kullanılamayacağını hatırlayarak, bunun yerine bir arayüz oluştururuz:
IMappable<K<_>, T> where K<T> : IMappable<K<_>, T>
Sonra hem arabirimini uygulamak List<T>
ve Option<T>
olarak IMappable<List<_>, T>
ve IMappable<Option<_>, T>
sırasıyla. Gerçek (non-yüksek-kinded) türlerinde yer kısıtlamaları yüksek kinded türlerini kullanıyor Yaptığımız şey Option<T>
ve List<T>
. Scala'da bu şekilde yapılır, ancak Scala'nın özellikleri, tür değişkenleri ve onu daha anlamlı hale getiren örtülü parametreler gibi özellikleri vardır.
Diğer dillerde, daha yüksek türlü türleri doğrudan soyutlamak mümkündür. Yazı sistemleri ile ilgili en yüksek makamlardan biri olan Haskell'de, daha yüksek bir türe sahip olsa bile, herhangi bir tip için bir tip sınıfını ifade edebiliriz. Örneğin,
class Mappable mp where
map :: mp a -> mp b
Bu, (tanımlanmamış) türüne doğrudan yerleştirilmiş bir kısıtlama mp
tek tip bir parametre alır, ve bu fonksiyon ile ilişkili gerektiren map
bir döner mp<a>
bir halinde mp<b>
. Daha sonra Mappable
, nesne yönelimli dillerde olduğu gibi, kalıtım kısıtlaması koyabileceğiniz gibi, daha yüksek tür türlerini kısıtlayan işlevler yazabiliriz . İyi sıralama.
Özetlemek gerekirse, daha yüksek dereceli türlerden yararlanabilmeniz, onları kısıtlama veya tür kısıtlamalarının bir parçası olarak kullanma yeteneğinize bağlıdır.