Haskell'in tipi sistemi, işlevsel programlamanın anlaşılmasında bir engel midir? [kapalı]


33

Haskell'i fonksiyonel programlamayı anlamak amacıyla, diğer dillerde edindiğim içgörüyü uygulayacağım beklentisi ile inceliyorum (Groovy, Python, JavaScript ağırlıklı olarak).

Haskell'i seçtim çünkü çok işlevsel olduğu ve devlete güvenmesine izin vermeyeceği izlenimini edindim.

Haskell'i öğrenmeyi seçmedim çünkü son derece katı tip bir sistemde gezinmekle ilgileniyordum.

Sorum şu: Güçlü bir tip sistem, son derece saf bir işlevsel dilin yan ürünü mü gerekli bir ürün mü, yoksa bu Haskell'e özgü ilgisiz bir tasarım seçimi mi?


6
Açıkça bir şey yazmak istemiyorsanız, açık bir şekilde herhangi bir şey yazmanıza gerek yoktur. Haskell, kendi başına gayet iyi türler çıkartabilir. Ve potansiyel olarak iki uyumsuz türü saklayan tek bir değişkene sahip olacaksınız gibi değil.
Anon.

4
@Anon evet, ancak listeleriniz homojen olmalıdır. İnan bana, bu tür şeyler engellemeyebilir, hatta türden çıkarımda bile.
Eric Wilson

13
@ FarBoy ve Belki kullanımı ile yanlış nedir? Java sizi gerçekten kullanıyor, Belki de tüm derslerde yapılması gereken garip bir şey.
alternatif olarak

3
Ve gerçekten heterojen bir liste kullanmak istiyorsanız elbette cebirsel veri türlerini kullanabilirsiniz.
Alternatif olarak

1
Bu noktada @ mathepic, gerçekten geçerli bir soru olan orijinal sorumun izini gerçekten kaybettik.
Eric Wilson

Yanıtlar:


40

Haskell'in tip sistemini anlamanın, işlevsel programlamayı anlamanın bir yükselteci olduğuna inanıyorum.

Tamamen işlevsel programlama ile ilgili olan şey, her türlü şeyi dolaylı olarak yapmanıza izin veren yan etkilerin olmaması durumunda, tamamen işlevsel programlamanın programlarınızın yapısını çok daha belirgin hale getirmesidir.

Haskell, halının altındaki şeylere vurmanızı önler, programınızın yapısını açıkça ele almaya zorlar ve bu yapıları tanımlamak için bir dil öğretir: türlerin dili. Türleri, özellikle de Haskell gibi zengin türleri anlamak, sizi herhangi bir dilde daha iyi bir programcı yapacaktır.

Haskell çok iyi yazılmış olmasaydı, monad, uygulama functorları ve benzerleri gibi kavramlar hiçbir zaman programlamaya uygulanmazdı.


2
Bu iyi bir cevap, ek olarak, tip sistemi ilk başta sıradışı görünse de, daha sonra daha gelişmiş kavramları öğrenmeye başladığınızda, yalnızca bu tipe bağlılık nedeniyle yapılabilecek bazı şeyler olduğunu göreceksiniz. sistemi (yukarıdaki listeye Paralel ve STM ekleyin). Diğer tip sistemlerde starter olmayan şeyler doğal olarak Haskell sistemine uyar. Tavsiyem: bir süre onunla kal, zaman içinde batmasına izin ver (bu bir "tıkınma" dili değil).
anon

2
Bunun çok eski bir cevap olduğunu biliyorum, ama aslında aynı fikirde değilim. Bazı şeylerin dilde olduğu kadar açık bir şekilde olduğu gibi, tip sisteminin, özellikle de Devlet ve Parsec gibi monadlarda olduğu gibi , halının altında bir TON miktarını taradığını düşünüyorum . Bu aslında dilin kütüphanelerini öğrenme yeteneğime çok büyük müdahale ediyor.
Savanni D'Gerinel

4
@ SavanniD'Gerinel: Bence bu cevabın “halının altına bir şey sokmak”, örtük işlevsellik eklemek anlamına gelmiyor (Haskell, örneğin monadlar aracılığıyla kontrollü bir şekilde yapıyor ve kazan plakasını azaltmaya yardımcı oluyor) ama bunun yerine bir kod parçasına izin veriyor beklenmeyen bir şey yap. Örn: Haskell'de saf bir fonksiyonun asla yan etkileri olmaz. Dönemi. Diğer birçok dilde bunu bir işlevin belgelerinde vaat edebilirsiniz, ancak kendi dilinizde hiçbir şey kodunuzun bir yerinde bazı yan etkilere maruz kalmanızı önleyemez.
Giorgio

33

Dinamik olarak yazılmış en işlevsel dil, tartışmalı olarak Şemadır. Bu, Haskell'in tip sisteminin saflığının bir göstergesi olduğunu söyledi. Bu bir "saflığı nasıl ölçer?" Sorusudur. Haskell'in tür sistemi, içerideki saf olmayan işlemleri kolayca gidermenizi sağlar IO. Bunu yapmak için statik bir tip sisteme ihtiyacınız vardır.

Ancak diyelim ki Haskell'in tip sistemi, işlevsel programlama ile ilgisi yoktur. Bu tür bir eğitim çalışmasında tip sisteminin size yardımcı olmayacağını iddia etmek yine de kocaların yüksekliği olacaktı. Haskell'in tip sistemi zengin ve karmaşıktır ve C ++ ve OCaml'in tip sistemlerine göre daha ilginçtir.

Bir engel mi? Hayır, bunun bir varlık olduğunu düşünüyorum. IOÖrneğin Haskell'in tembelliğiyle nasıl başa çıkacağınızı düşünmeye çalışın .


8
+1 Haskell'in tip sistemi, buna alışınca arkadaşınız olabilir.
Larry Coleman

"Bunu yapmak için statik bir sisteme ihtiyacınız var". Gerçekten mi?
Jon Harrop

1
"C ++ ve OCaml tiplerine göre daha ilginç". OCaml'ın birinci sınıf yüksek dereceli modüllerini ve yapısal olarak yazılmış çıkarımlı nesne sistemini ve polimorfik varyantlarını çalıştınız mı?
Jon Harrop

2
@JonHarrop veya bir etki sistemi veya saflığı ölçme / değerlendirme yolu. Evet, bu yüzden onları karşılaştırmak ilginç. Farklı seçenekler farklı diller için yapar.
Logan Capaldo

20

Clojure dinamik olarak yazılmış ve neredeyse Haskell kadar saf, bu yüzden Haskell'in tip sisteminin mutlak bir gereksinimden çok bir tasarım tercihi olduğuna dair iyi bir argüman var. Her ikisinin de kesinlikle güçlü noktaları var, bu yüzden Haskell'in sertliğini gerçekten sevmiyorsanız Clojure'u düşünebilirsiniz (ancak aşağıya bakınız).

Haskell'i ilk kullanmaya başladığımda, yazı sisteminin can sıkıcı olduğunu düşünmüştüm ve sadece yazı tipi çıkarımından dolayı tolere ettim. Derleyicinin yapmama izin vermiş olmasına rağmen, derlemenin çalışmamasına neden olan şeyler hakkında şikayette bulunduğum tip hataların çoğunun yakında olduğunu keşfettim (örneğin, yanlışlıkla concatMap yerine haritayı kullanarak). Daha sonra tip kontrolünü geçen programların genellikle doğru olduğunu veya en azından düzeltmeye yakın olduğunu keşfettim. Hatta bir fonksiyon tipini değiştirerek yeniden derleme yaptığım ve derleyicinin başka nelerin değişmesi gerektiğini söylemesine izin veren tembel bir aşama bile yaşadım. Sonunda Haskell'in tip sisteminin aslında çok etkileyici olduğunu anladım ve programlarımı türler etrafında tasarlamaya başladım. Bu Haskell'in Kutsal Kasesi.


Unutulmaması gereken başka bir şey: Hem Scheme hem de Haskell kullanarak aynı anda fonksiyonel bir programlama öğrendim (sınıf için eski ve eğlence için ikincisi). Haskell'in kalıp uyumu ile özyinelemeyi anlamanın , Scheme'deki s ve s'lerden çok daha kolay olduğunu , ayrıca Clojure'a da taşıdığını hayal ettim. ifcond
Tikhon Jelvis,

@Larry Coleman: Tip sistemleriyle ilgili kendi deneyimimi tam olarak açıklamak için +1: önce C ++, sonra Ocaml, ve şimdi kendi dilim Felix. Evet, hala derleyici hatalarını takip ederek refactor yapıyorum.
Yttrill,

8

Haskell'in tür sistemi, efektleri saf koddan izole etme becerisinin anahtarıdır. Efektleri başka bir şekilde yalıtamazsanız veya efektleri tamamen kaldırmazsanız, güçlü bir statik tip sistem saf fonksiyonel programlama için bir gerekliliktir.

Haskell, güçlü, statik tip sistemli bir dilin çok güzel bir örneğidir. Bilgisayar bilimleri ve özellikle programlama dili tasarımında geniş ve yuvarlak bir eğitim istiyorsanız, Haskell öğrenmeniz gereken dillerden biri olarak mükemmel bir seçim olacaktır.

Tip sistemi çok büyük bir engel olmamalıdır. Programlayan insanlar, dinamik diller kullanırken bile Haskell'in tür sistemi kullanılarak kodlanabilecek yazım kurallarını takip ederler. Haskell ayrıca, C ++ ve Java gibi dillerle karşılaştırıldığında ayrıntılarını hafifleten tip çıkarımı sunar. Bir hata mesajı aldığınızda, derleyici derleme zamanında size sadece dinamik tipli bir dilin çalışma zamanında ne söyleyeceğini söyler.

Dinamik tip bir sistemin tam tersi güçlü tip bir sistem değil statik tip bir sistemdir. Güçlü tip bir sistem, zayıf tip bir sistemin tam tersidir.


1
Örneğin, C statik ancak zayıf bir şekilde yazılmıştır. Tipleriniz var, ancak tip sistemini tamamen altüst etmek, makineye özgü gösterimler vb. İle oynamak çok kolaydır. Dinamik olarak yazılmış birçok dil OTOH oldukça güçlü şekilde yazılmıştır - birkaç örtülü yayın, birkaç tipi (eğer varsa) tip sistemini altüst etmek.
Steve314,

4

Aptalca hatalar yaptığınızda hemen size haber verir. Bu yardımcı olur. Bu son dönem Racket'te (Şema) çalışıyorum ve tercümanımdaki bazı işlevlere göre ayrıştırılmış bir ast beklediğimden daha önce hiç ayrılmamış bir s-exp’i geçtiğimden beri, orta boy test takımı. Statik yazım olsaydı, hemen dikkatimi çekti.

Tabii ki, mantık hataları gerçekten tip sistem tarafından yakalanamaz, ancak nasıl batırılabileceği yolların sayısı büyük ölçüde azalır.

Ayrıca, tür çıkarımı, isterseniz tür sistemini yok saymanıza izin verir. Hala orada, ancak sizin tarafınızdan aktif giriş yapmanıza gerek yok. İşlevlerinizin türlerini anlamak yine de yararlıdır, ancak doğru kod iyi çalışacaktır.

Haskell'in saflığı, kendi tip sisteminde kodlanmıştır. IO monadı saf olmayan kodun saf fonksiyonlara sızmasını engelleyen bir tip seviye yapısıdır, bu nedenle saflık tip sistemi tarafından garanti edilir.


8
Haskell'in tür sistemini göz ardı edebileceğinizi düşünüyorsanız, o zaman çok fazla Haskell kodlamadığınızı düşünüyorum.
Eric Wilson

Görmezden gelme, görmezden gelme, GHCi'ye yükleme ve git: t yapma. Ama yine de bazı durumlarda Entegre veya diğer fonksiyonlardan bazen serpiştirmeye ihtiyacınız olacak.
Theo Belaire

1
Tyr, yazı tipi çıkarımında bile, Haskell işlevlerinin kullanılmasının ve kodlanmasının% 90'ı, lanet olası şeylerin birbirine bağlanmasına neden oluyor; bu da, kendi tip sisteminin ve arkalı yazı denetleme hata mesajlarının anlaşılmasını gerektiriyor. ": T" bile sihirli bir çözüm değildir, programın nasıl derleneceğini anlamada ilk adımdır.
Andres F.

Bazı bölümler dağınık, katılıyorum. Gerçekten prelüddeki sayısal şeylerin temizlenip sabitlenmeye dayanabileceğini düşünüyorum, çünkü olduğu gibi korkunç bir karışıklık. Ancak, temel işlevsel yönlerin çoğu oldukça temizdir. harita, filtre, kat / l ve diğer eğlenceli işlevler oldukça iyi çalışıyor.
Theo Belaire,

2

"İşlevsel" bir dil olmak, dilin birinci sınıf nesneleri olan (diğer şeylerin dışında) anlamına gelir.

"Saf" bir dil olmak, işlevlerin matematiksel işlevler olduğu anlamına gelir (işlemlerin aksine) - aynı girdi verildiğinde, her zaman aynı çıktıyı üretirler.

Bir "saf işlevsel dil", her ikisinin de yukarıda tutulduğu dildir. Bir "pure- farkında değilim ly işlevsel dil".

Güçlü tip bir sistem, saf ancak pratik bir dile sahip olmanın temiz bir yoludur. Türler, derleyicinin optimizasyonları belirlemesine yardımcı olur, ayrıca formların doğruluğunu sağlamak için ayırır. (Ancak, bu tek yol değil - clojure saf, ancak Haskell kadar güçlü bir tür sistemi yok.)

Eğer yazı sistemi sizi rahatsız ediyorsa, Scheme gibi daha dinamik bir dil denemenizi ya da Haskell'in tür çıkarım sistemini kullanmaya başlamanızı öneririm.


0

Evet, tip sistemi inanılmaz bir varlıktır. Monadların nasıl çalıştığını veya bazı birleştiricilerin tip sistemi olmadan nasıl çalıştığını tanımlamak bile çok zor olurdu. Haskell ile ilgili kaç öğreticinin, REPL'de söz konusu işlevin türünü a: t ile düşünmenizi istediğini düşünün. Dinamik olarak yazılmış bir dilde bu sizin için uygun değildir. Tabii ki, tip sisteminin tüm karmaşıklığı hala orada. Bir monad hala bir monaddır. Ancak, dil konuyla ilgili ellerini yıkamaya karar verdi ve hiç yardım etmedi. Tek başınasın, dostum. Dinamik olarak yazılmış dilleri çalmıyorum. Onları çok seviyorum. Şema mükemmel bir araçtır. Ancak, dinamik dillerdeki monadlar gibi şeyler hakkında konuştuğumuzda, genellikle bir gösterim yarattığımızı fark edeceksiniz.prosedürlerin türünü tanımlamak için. İşlevsel bir programcı, bir şekilde veya diğer türleriyle savaşır. Haskell'in tipi denetleyicisi, nasıl yapılacağını öğrenmek için sadece size iyi araçlar verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.