Haskell'in herhangi bir olumsuz tarafı ya da sorunu var mı?


47

Bir sonraki (nispeten önemsiz) kişisel projem için Haskell'e dalmak istiyorum. Haskell ile başa çıkmamın nedenleri:

  1. Kafamı tamamen işlevsel bir dile sokun
  2. Hız. Bunun tartışılabileceğinden emin olduğum halde profiller C ++ 'a yakın Haskell çivileri gördüm (ve Erlang'dan biraz daha hızlı görünüyor).
  3. Hız. Warp web sunucusu hemen hemen her şeyle karşılaştırıldığında hızlı bir şekilde delice görünüyor .

Yani, buna bakıldığında, aradığım şey Haskell ile birlikte gelen olumsuzluklar veya problemler. Web'in neden Haskell'in İyi Bir Şey olduğu hakkında muazzam miktarda bilgi var, ancak çirkin tarafı hakkında pek fazla konu bulamadım (hiç umrumda olmayan sözdizimi ile ilgili sıkıntılar dışında).

Aradığım şeyin bir örneği Python'un GIL'i gibi olabilir. Gerçekten bir CPython ortamında eşzamanlılığı kullanmaya başlayana kadar kafasını desteklemeyen bir şey.


4
Bunu stackoverflow'ta
buldum

26
Daha az programcının beyin erime sorunları ile ilgilendiğini duydum. Tedavi edilmesi çok pahalı bir durumdur.
ChaosPandion

1
@FrustratedWithFormsDesigner: Bağlantı için teşekkürler. Ancak, orada hala burada olman .. Haskell için herhangi bir teknik downsides yapılan herhangi bir atıf yoktur değil herhangi? ;)
Demian Brecht

6
@ChaosPandion: Ben de aynı duydum .. Ama eğer değil beyin erime, aslında edilir çalışıyor ? ;) Ayrıca, kendimi daha küçük bir programcı olarak görmezdim, bu yüzden fazla endişelenmiyorum;)
Demian Brecht

3
@ChaosPandion: Ve çoğu sağlık planı bunu kapsamıyor. :(
FrustratedWithFormsDesigner

Yanıtlar:


48

Aklıma gelen birkaç olumsuzluk:

  • Dilin doğası ve akademik dünyadaki sağlam kökleri nedeniyle, topluluk çok matematik düşünür; Eğer pragmatik biriyseniz, bu zaman zaman çok zor olabilir ve jargon konuşamıyorsanız, diğer birçok dilden daha zor bir zamana sahip olacaksınız.
  • İnanılmaz bir kütüphane zenginliği varken, dokümantasyon çoğu zaman tersinedir.
  • Nazik giriş seviyesi dersleri bulmak çok az ve zordur, bu nedenle ilk öğrenme eğrisi oldukça diktir.
  • Birkaç dil özelliği gereksiz yere sakar; belirgin bir örnek, kayıt sözdiziminin nasıl bir adlandırma kapsamı getirmediğidir, bu nedenle aynı kayıt alanı adına aynı modül ad alanı içinde iki farklı tipte sahip olmanın bir yolu yoktur.
  • Haskell tembel değerlendirmeyi temerrüde düşürür ve bu çoğu zaman harika bir şey olsa da, bazen iğrenç şekillerde sizi ısırır. Tembel değerlendirmeyi önemsiz olmayan durumlarda saf olarak kullanmak, gereksiz performans darboğazlarına neden olabilir ve kaputun altında neler olup bittiğini anlamak kolay değildir.
  • Tembel değerlendirme (özellikle saflıkla ve agresif bir şekilde optimize eden bir derleyiciyle birleştirilir), aynı zamanda, yürütme emri için kolayca sebep olamayacağınız anlamına gelir; Aslında, belli bir kod parçasının belirli bir durumda gerçekten değerlendirilip değerlendirilmediğini bile bilmiyorsunuz. Sonuç olarak, Haskell kodunun hata ayıklaması farklı bir zihniyet gerektirir, çünkü yalnızca kodunuzda adım atmak daha az kullanışlı ve daha az anlamlıysa.
  • Haskell'in saflığı nedeniyle, G / Ç gibi şeyler yapmak için yan etkileri kullanamazsınız; Etkileşim sağlamak için bir monad ve 'kötüye kullanım' tembel değerlendirmesi kullanmanız ve monadik bağlamı G / Ç yapmak isteyebileceğiniz herhangi bir yere sürüklemeniz gerekir. (Bu aslında pek çok yönden iyi bir özelliktir, ancak pragmatik kodlamayı zaman zaman imkansız hale getirir.)

16
Aslında şu anda çevrimiçi ücretsiz olarak sunulan bazı gerçekten iyi tanıtım kitapları var. Büyük İyiliğe Sahip Bir Haskell'i Öğreniyorum şimdiye kadar okuduğum en iyi başlangıç ​​programlama kitaplarından biri ve Gerçek Dünya Haskell harika bir ara kaynak.
Tikhon Jelvis

1
@TikhonJelvis: Gerçekten de kullanmaya değer bulduğum tek iki aday; “Seni Öğrenmek Bir Haskell” her şeyden çok kafamı karıştırdı, “Gerçek Dünya Haskell” benim için çalıştı, ancak biraz programlama geçmişine sahip oldu. Aynı zamanda "Haskell'e Nazik Giriş" de var, ama her şey yumuşak, özellikle de Matematikte bir geçmişiniz yoksa.
tdammers

"Haskell'e Nazik Giriş" ve "Gerçek Dünya Haskell" kullanıyorum. İkisinin birleşimi bana birçok yararlı bilgi verdi. Önemsiz olmayan bir projeye hazır olduğum bir seviyedeyim ama ne yazık ki bunun için fazla zamanım yok.
Giorgio

9
“eğer pragmatik bir kişiyseniz…”: bazen matematik odaklı bir dil kullanmak, daha sonraları çok fazla hata ayıklamaktan kaçınmanız durumunda çok pratik bir karar olabilir. Elbette, bir aracı kullanarak ne kadar zaman kazandığınızı ve nasıl kullanacağınızı öğrenmek için ne kadar fazla zamana ihtiyacınız olduğunu dengelemek gerekir.
Giorgio

Monad'lar (ve diğer dillerde de yaparlar) katı bir dilde aynısını yaparlardı. Etkileşim sağlamak için tembel değerlendirmeyi kesinlikle "kötüye kullanmayın", Haskell'de katı bir etkileşimli program yazmak çok önemlidir.
noktalı virgül

19

Haskell'in dezavantajlarının çoğu (Haskell'in başının da çoğu gibi) iki belirleyici özelliğinden kaynaklanmaktadır: Tembel ve tamamen işlevseldir.

Tembel olmak, performansın nedenini zorlaştırır. Özellikle tembellikten hoşlanmayan insanlar için, ama deneyimli Haskellers için bile, tembellikten bazı durumlarda performansı nasıl etkileyeceğini görmek zor olabilir.

Tembellik, Kriter gibi kütüphaneleri kullanmadan doğru kıyaslamalar oluşturmanın daha zor olduğu anlamına gelir.

Tamamen işlevsel olmak, ne zaman değişken veri yapıları kullanmanız gerektiğine (istediğiniz performansın onlarsız elde edilmesinin mümkün olmadığı durumlarda - GHC'nin düşündüğünüz kadar sık ​​gerçekleşmeyen optimizeri sayesinde) olacağınız anlamına gelir. IO (veya ST) monadına sıkışmış, bu da kodu daha hantal hale getiriyor.

Hızınızdan hedeflerinizden biri olarak bahsettiğinizden beri, el ile optimize edilmiş Haskell kodu ile performansa çok fazla düşünmeden yazılan Haskell kodu arasında performansta genellikle büyük farklılıklar olduğunu belirtmeliyim. Ve elle optimize edilmiş Haskell kodu genellikle oldukça çirkindir (sanırım bunun diğer dillerde de geçerli olduğunu düşünüyorum).


1
Tamamen işlevsel aslında bir dezavantaj değil, bir satış özelliğidir. "Tembel" olmak bir dil anlamsızdır, tembel vs katı olmak bir tür meselesidir ve hem tembel hem de katı tiplerin kullanımları vardır. Haskell'ın ana olumsuzlukları (modüller birinci sınıf değildir) onun bok modül sistemi vardır (Yani Haskell gibi. Dillerin çoğu tembel türleri zorunda kalmayarak sakat gibi sıkı türlerini olmamasından tarafından sakat) ve aslında tipi sınıfları aslında kırmak (modülerlik "tür başına bir örnek" kuralı, derleyiciyi genel tür sınıfı örnekleri listesini tutmaya zorlar).
pyon

21
"Ve el-optimizasyonlu Haskell kodu genellikle oldukça çirkindir (sanırım bunun diğer dillerde de geçerli olduğunu düşünüyorum)." Bu. İnsanlar Haskell'in zerafetini göstermek istediklerinde, kısa ve tatlı bir kod yayınlarlar; bu, üretime benzer miktarda veriyle çalışıldığında maalesef size oldukça kötü performans verir. İnsanlar "Haskell C ++ kadar hızlı" olduğunu göstermek istiyoruz, onlar C. çok daha okunabilir sürümden daha hala yavaştır kodu okumak için dolambaçlı ve zor yayınlamak
quant_dev

12

Bir Haskell uzmanı değilim: Temel bilgileri öğrendim ancak ne yazık ki Haskell'de ciddi bir proje yapma şansım olmadı (ancak bu dili çok seviyorum çünkü istiyorum).

Ancak, bildiğim kadarıyla ve işlevsel programlamaya oldukça yakın bir alanda çalışan birisiyle yapılan bir tartışmadan, Haskell, örneğin grafikleri taramanız ve gerçekleştirmeniz gereken grafik algoritmalarını uygulamak istediğinizde en iyi çözüm olmayabilir. grafik yapısında birçok yerel değişiklik.

Bir grafik genel olarak özyinelemeli bir yapıya sahip olmadığı için, benim düşüncem, en iyi yaklaşımın, aralarındaki yapıları ve işaretçileri (örneğin C ++ 'da yapabildiğiniz gibi) kullanarak grafiğin bir kopyasını oluşturmak ve işaretçileri değiştirerek manipüle etmektir. düğüm oluşturma, yok etme vb.

Haskell'deki bu tür veri yapılarının ve işlemlerinin nasıl doğru bir şekilde ele alınabileceğini merak ediyorum, çünkü Haskell'deki bilgim nedeniyle yukarıdaki gösterimi / yaklaşımı kullanmak mümkün değil. Bu makalede Haskell'deki grafik algoritmaları ile ilgili bazı problemler kısaca açıklanmıştır.

DÜZENLE

Geçenlerde fonksiyonel programlama uzmanıyla konuştum ve belirli grafik algoritmasını etkin bir şekilde uygulamanın Haskell'de oldukça zor olabileceğini onayladı: C veya C ++ 'da yaptığınız gibi işaretçiler arasında dolaşmak çok daha hızlı olabilir.


Saf işlevsel bir dünyada grafik manipülasyonu / geçişi üzerine ilginç notlar (ve bağlantı). Bunu düşünmemiştim.
Demian Brecht

7
Tamamen işlevsel grafik algoritmaları ilginç bir konudur. İdiomatik çözüm, işaretçileri tamamen işlevsel sözlüklerle değiştirerek zorunlu temsili taklit etmektir, örneğin, belirli bir köşeyi kenarlarına sahip olan köşe kümesine eşlemek. Bununla birlikte, zayıf bir sözlük kullanılmadığı sürece bu bellek sızdıracaktır, çünkü erişilemeyen alt yazılar toplanamaz ve bilinen tamamen işlevsel bir zayıf sözlük yoktur. Günün sonunda, son teknoloji ürünü tamamen işlevsel bir çözüm, hem çok daha karmaşık hem de daha az verimli!
Jon Harrop

1
Öte yandan, grafik algoritmaları hata ayıklamak için zor olabilir ve kalıcı veri yapısı bu sorunu hafifletebilir ...
Jon Harrop

Bir grafik veri türü geliştirmenin mümkün olup olmadığını merak ediyordum (ByteString'in fikrini takip ederek: verimli iç gösterim artı dönüşüm / erişim fonksiyonları). Monadları kullanarak bu grafikleri değişken hale getirmek mümkün olmalıdır. Tabii ki bu, grafikleri temsil etme konusuna değinecek, fakat grafik algoritmalarını uygulayamayacak.
Giorgio

DAG'ler bir şeydir. Her şey için tembellikten faydalanabilir ve "düğümü bağlayabilirsiniz".
danielm

4

Haskell'in aşağı tarafı farklı. Daha yaygın olarak öğretilen veya konuşulan dillerden daha büyük bir adımdır, bu nedenle daha büyük bir öğrenme eğrisi olacaktır. Ayrıca, sıkışırsanız, yardımın kullanılabilirliğini sınırlayabilen bir dilde daha az popülerdir. Bunlar gerçekten de büyük dezavantajları değildir.

Potansiyel bir dezavantajı olan bir şey işlevsel bir dil olmasıdır, bu nedenle belirli sorun alanları için daha az faydalıdır, ancak bu nesne yönelimli diller için de geçerlidir. Genellikle diller, öğrenme eğrilerinin ötesinde, en azından nispeten popüler olan diller için gerçek olumsuzluklara sahip değildir. Bir dil tamamlandığı sürece, teorik olarak her şeyi yapabilir.


3
Bütünlüğü tamamlamak kırmızı bir ringa balığıdır. Hesaplama teorisi! = Pratik programlama.

1
@delnan bu yüzden teorik olarak dedim
Ryathal

2
Haskell'in iddia edildiği kadar az yararlı olduğu bu "sorun alanları" nelerdir?
Andres F.

3
Toplumun daha küçük olduğu doğru olsa da , aslında orantısız olarak aktif. Bence freenode'deki #haskell kanalı, dil kanalları içinde popülerliğin sadece #python'un arkasında olduğunu ve SO üzerinde Haskell hakkındaki soruları yanıtlamanın şaşırtıcı derecede rekabetçi olduğunu düşünüyorum :)
Tikhon Jelvis

@AndresF. - "daha az işe yaramaz" diyecek kadar ileri gitmedim, ama işte Haskell'in kesinlikle hala bebeklik dönemini gösterdiği bazı alanlar var: 1) ağır DP - Basit bir sırt çantası algoritması kodladım ve kelimenin tam anlamıyla şok oldum yavaş oldu. Kutulu dizileri kullanıyordu, bu yüzden biraz ek yük bekliyordum, ancak beklediğimden çok daha kötüydü. 2) büyük önemsiz olmayan oyunlar - AFRP başlangıç ​​aşamasındadır, bu nedenle özellikle iyi bir çerçeve yoktur ve performansın tahmin edilmesi hala çok zordur. Doom'un Haskell versiyonunu görmeden çok uzun zaman alacak. (
fragman

0

Yani, buna bakıldığında, aradığım şey Haskell ile birlikte gelen olumsuzluklar veya problemler.

“Haskell ile ilgili problemler” belirli alanlarda ortaya çıkma eğilimindedir. Haskell, uygulama programlaması için harika bir dildir, yazmaktan başka bir şey yapmamaktan çok daha keyiflidir. Desteklenmeyen bir şey yapmaya çalıştığınızda, örneğin, şu gibi şeyler ortaya çıkma eğilimindedir:

  • Çapraz derleme GHC bir çapraz derleyici olarak oluşturulabilir, ancak bu süreç oldukça karmaşıktır.
  • Gömülü uygulamalar. Haskell'in bir çöp toplayıcı aracılığıyla hafıza yönetimi var, bu yüzden bu çok şaşırtıcı değil.
  • Hız. Haskell, Rust kadar hızlı değildir, ancak çoğu durumda oldukça iyi rekabet eder. Uygulama alanına büyük ölçüde bağlıdır - saf hesaplamalar iyi bir şekilde optimize edilir, ancak “bir dosyayı bir arabellekte oku ve satır sayısını say” gibi bir şey Haskell'de ifade etmek zordur.
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.