Zayıf, güçlü ve güçlü yazım oldukça belirsizdir. Ayrıca, en yakın olanı 'güçlü tiplendirme' nin genel bir kullanımı olduğundan, tiplerin dökümünü zorlaştıran şeylere atıfta bulunmaktır, bu da daha güçlü tip sistemleri tanımlamak için hiçbir şey bırakmaz. 30 libreden az taşıyabiliyorsanız, zayıfsınız ve daha fazla kaldırabilecek herkes aynı “güçlü” kategoridedir - yanıltıcı bir ayrım.
Bu yüzden tanımı tanımıyorum:
- Zayıf yazılmış sistemler, bazı şeyleri yapmanıza engel olmak için türler kullanır (hatalar gibi)
- Kesinlikle yazılan sistemler , sizin için işleri yapmak için türleri kullanır
Senin için bir şeyler yaparak ne demek istiyorum? Pekala, bir görüntü dönüştürme API'sini Servant çerçevesinde yazmayı inceleyelim (Haskell'da, ancak bunu takip etmek için gerçekten bilmenize gerek yok, göreceksiniz ...)
{-# LANGUAGE
TypeOperators,
DataKinds
#-}
import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels
main :: IO ()
main = run 8001 conversion
Bu, Servant paketini ve JuicyPixels eklentisini Servant'a ekleyen bazı modüller istediğimizi ve programın ana giriş noktasının, Warp arka ucunu kullanan sunucu olarak 8001 portundaki 'dönüşüm' işlevini çalıştırmak olduğunu söylüyor. Dil bitini yoksay.
conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler
Bu, dönüşüm işlevinin API'nin 'ConversionApi' türüyle eşleşmesi ve isteklerin işlev tarafından işlendiği bir sunucu olduğunu söylüyor handler
type ConversionApi
= ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
:> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
Bu tür belirtiyor ConvesionApi
. '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] listesi tarafından belirtilen gelen içerik türlerini kabul etmemiz ve bunları bir DynamicImage olarak ele almamız ve aynı içerik aralığına dönüştürülmüş bir DynamicImage döndürmemiz gerektiğini söylüyor. türleri. Tam olarak ne anlama geldiği konusunda endişelenmeyin:> şu an için mutlu sihir olarak düşünün.
Bu yüzden, tercih ettiğim tanımıma göre, zayıf yazılmış bir sistem artık aşağıdakileri sağlayabilir:
- Yanlış giden içerik türünü döndürmüyorsunuz
- Gelen isteği yanlış içerik türü olarak ayrıştırmazsınız
- Sunucumuz daha karmaşık olsaydı, hatalı biçimlendirilmiş URI'lar oluşturmamızı önlerdi, ancak aslında bağlantıları içeren herhangi bir HTML sayfası döndürmüyoruz (ve tür yapamayız!)
- Gerçekten iddialı ve zayıf bir yazma sistemi, gelen ve giden tüm içerik türlerini ayrıntılı bir şekilde ele aldığımızdan emin olarak kontrol edebilir ve bu da türün yalnızca bir kısıtlama yerine bir özellik belgesi olarak hareket etmesine izin verebilir.
Tüm yüce hedefler, ancak aslında tanımlanmış bir sistem olarak nitelendirilmek için yeterli değil, yukarıdaki tanım. Ve şimdi bu şartnameyi izleyen kod yazmanın zor kısmına gitmeliyiz . Gerçekten güçlü bir tip sistemde şunu yazıyoruz:
handler = return
Ve sonra bitti. İşte bu, yazacak başka kod yok . Bu tamamen işlevsel bir web sunucusudur (kaçırdığım herhangi bir yazım hatası modulo). Tür, derleyiciye web sunucumuzu oluşturmak için ihtiyaç duyduğumuz her şeyi anlattı ve içe aktardığımız türlerden ve paketlerden (teknik olarak modüller) söyledi.
Peki, bunu ana uygulama ölçeğinde yapmayı nasıl öğrendin? Aslında onları daha küçük ölçekli uygulamalarda kullanmaktan pek de farklı değil. Mutlak türler, bunlarla ilgili ne kadar kod yazıldığını önemsemez.
Çalışma zamanı türü denetimi muhtemelen kaçınmak isteyeceğiniz bir şeydir, çünkü bu büyük bir fayda sağlar ve türlerin işleri basitleştirmekten ziyade, projenizi çalışmak için daha karmaşık hale getirmesine olanak sağlar.
Gibi, çoğunlukla sadece türleri ile şeyler modelleme bir meseledir. Bir şeyleri modellemek için iki ana yol (veya genel olarak bir şeyler inşa etmek) aşağıdan yukarıya ve aşağıdan yukarıya doğrudur. Yukarıdan aşağıya, en üst düzeyde işlemlerle başlar ve modeli oluştururken modellemeyi ertelediğiniz kısımlara sahip olursunuz. Aşağıdan yukarıya modelleme, temel işlemlerle başladığınız gibi temel işlemlerle başladığınız ve ardından projenin işleyişini tamamen ele geçirene kadar daha büyük ve daha büyük modeller oluşturduğunuz anlamına gelir. Aşağıdan yukarıya daha somut ve inşa edilmesi daha hızlıdır, ancak yukarıdan aşağıya, düşük seviye modellerinizi gerçekte nasıl davranmaları gerektiği konusunda daha iyi bilgilendirebilir.
Türler, programların matematikle nasıl ilişkili olduğu anlamındadır; bu nedenle, ne kadar karmaşık hale gelebilecekleri ile ilgili bir üst sınır ya da onlar hakkında bilgi edinmenin 'yapılabileceği' bir nokta yoktur. Neredeyse üst düzey üniversite dersleri dışındaki kaynakların tümü, türlerin belirli bir dilde nasıl çalıştığına adanmıştır, bu yüzden buna da karar vermeniz gerekir.
Sunabildiğim kadarıyla, türler şöyle sınıflandırılabilir:
- Çok zayıf yazılmış, JavaScript gibi şeyler [] + {} tanımlanmış
- [] + {} Yapamadığınız Python gibi zayıf yazılan, ancak denemeden bu kontrol edilmez
- Zayıf bir şekilde C veya Java gibi yazılır; [] + {} yapamazsınız, ancak bu derleme zamanında kontrol edilir, ancak daha gelişmiş tür özelliklerine sahip değilsiniz
- C ++ şablon metaprogramming gibi türlerin sadece zorlayıcı özellikleri olduğu, zayıf ve güçlü şekilde yazılan sınır arasındaki sınırın aşılması.
- Tamamen Güçlü olarak yazılmış, yukarıda gösterildiği gibi türlerin işleri yaptığı daha karmaşık Haskell programları gibi
- Türleri ve değerlerin birbirleriyle etkileşime girebileceği ve birbirlerini sınırlayabileceği Agda veya Idris gibi çok yazılanlar. Bu, tür sistemlerinin aldığı kadar güçlüdür ve içlerinde programlama, programınızın ne yaptığı hakkında matematiksel kanıtlar yazmakla aynıdır. Not: Ağda'da kodlama, kelimenin tam anlamıyla matematiksel ispatlar yazmıyor, türler matematiksel teoriler ve bu tiplerle olan işlevler, bu teorileri ispatlayan yapıcı örneklerdir.
Genel olarak, bu listeden aşağıya indikçe, bu tipler sizin için daha fazlasını yapabilir, ancak en altta, stratosfere tırmanıyorsunuz ve hava biraz inceliyor - paket ekosistemi çok daha küçük ve İlgili bir kütüphaneyi bulmak için kendinize daha fazla şeyler yazmanız gerekecek. Giriş engeli, aşağı indikçe daha da artar, çünkü büyük ölçekli programlar yazmak için yeterince sistem türünü anlamanız gerekir.