Durum değiştirmeye güvenmemek neden iyidir?


16

Bu soru /software/25569/is-haskell-worth-learning sorudan kaynaklanmaktadır

Genellikle Haskell'in diğer dillerde kodlama becerilerinizi nasıl geliştirdiği hakkında sık sık tekrarlanan açıklamalar yapılır ve bunun nedeni Haskell'in vatansız olması ve bu iyi bir şeydir.

Neden?

Birinin bunu sadece sol elle yazmakla veya belki de bir gün boyunca gözlerinizi kapatmakla ve sadece dokunmaya dayanarak karşılaştırdığını gördüm. Elbette bundan daha fazlası var mı?

Donanım belleği erişimi veya büyük bir performans kazancı olan başka bir şeyle mi ilgili?


2
Haskell akademik. Zengin Hickey'nin Clojure hakkında bazı derslerini izlerdim - orada katil pragmatik argümanlar yapar (Javier'in 3 noktasına benzer, ama aynı zamanda basit bir şekilde yapılır).
İş


6
Haskell'in "akademik" olması, pratik olmadığı veya pragmatik olmadığı anlamına gelmez.
Tikhon Jelvis

Yanıtlar:


17

başımın üstünde en az üç büyük avantaj var:

  1. programları matematiksel ifadelere daha yakın yapar. Matematikte xdeğişmez, denklemi çözene kadar ne olduğunu bilmiyorsunuz.

  2. Sonunda , devlet değişikliği var (sonuçta, bilgisayar bu şekilde düşük seviyede çalışıyor); ancak dil tarafından belirli yerlerle sınırlıdır. bu, derleyicinin diğer kodun bağlı olduğu hiçbir şeyi değiştirmediğini bildiğinden, kodu optimize etmek için hareket ettirmesine olanak tanır.

  3. Eşzamanlı kodun değişmeyen verilere erişmek için senkronize edilmesi gerekmez, bu nedenle hem SMP paylaşılan bellek sistemlerinde (günümüzün tüm çok çekirdekli sistemlerinde) hem de gevşek bağlı kümelerde eşzamanlılık artırılır.


3
Fonksiyonel programlama propansları en çok stres # 3'ü koyar, yani daha kolay eşzamanlılık prorammingi.
Mart'ta

4
@Mchl: Deneyimlerime göre, "1'i anlamak daha kolay ve mantıklı bir şekilde" en çok strese giriyorlar. Bu tür dil toplulukları arasında farklılık gösterebilir.
sepp2k

+1, çok eksiksiz bir cevap. @ sepp2k: her ikisi de önemli sanırım. Bir program hakkında akıl yürütmek, günlük olarak yaptığımız şeydir ve eğer durumun çok gizli bir fonksiyonda değişmediğini kontrol etmek zorunda kalmazsanız, sadece yüksek seviyeli yöntemleri okumak ve olanları yakalamak çok daha kolaydır. Donanım açısından: çok çekirdekli ve çok işlemcilere gittikçe daha fazla ilerlediğimiz için (sanırım ev bilgisayarları çok işlemcilere sahip olmak biraz zaman alacaktır), eşzamanlı programlamayı kolaylaştıran bir dile sahip olmak bir primdir.
Matthieu M.8

İyi yanıt, # 2, cevap olduğunu düşündüğüm şeydi ve çok işlemciliğin avantajlarını sık sık okumuş olmama rağmen, nadiren açıkça, harika bir iş olarak ifade edildi.
ocodo

1
@Yttrill, işlevsel diller, çöp toplama konusundaki güvenleri bakımından benzersiz değildir ve değişmez verilerle uğraşırken çöp toplama çok daha kolaydır. Komut tabanlı bir mimaride herhangi bir hesaplama yapmak, durumu değiştirmek anlamına gelir, bu da işlevsel dillerin paralel hale getirilmesinin daha zor olduğu anlamına gelmez. İşlevsel diller paralellikte sallanır; arama verileri paralel Haskell, bu zorunlu bir dile eklemek neredeyse imkansız bir özellik.
dan_waterworth

4

İşte bir başka avantaj: azaltılmış kuplaj. Şunun gibi bir kodunuz varsa:

 function doStuff(x) { return x + y;}

ve başka yerlerde:

 function doOtherStuff(x) { y++; return y + x;}

bu durumda iki işlev dolaylı olarak bağımlıdır . Aramanın aramadan doStuffetkilendiğini söylemenin kolay bir yolu yoktur doOtherStuff. Değişken durumu olmadan, bağlantıyı açık yapmanız gerekir.

Tabii ki, bu tüm değişken durumlarla ilgili bir sorun değil - mesele yaygın değişken durumlarla ilgili. Asıl çözüm, varsayılan olarak değişmezliğe sahip olmak ve değişebilir durumu tam da ihtiyacınız olan yere kısıtlamaktır.


+1. Birçok deneyimli programcı, yukarıdaki gibi kod yazmamayı biliyor ve "değişebilir durum bu durumda kötü" den "mutasyona uğradığımız ve daha işlevsel olarak yazdığımız durum miktarını ciddi şekilde azaltalım" dan gitmek için büyük bir adım değil, ama bu bir adım hayal kırıklığı yaratan az sayıda insan.
dan_waterworth

2

Basitleştirilmiş bir cevap: Tamamen işlevsel bir dilde bir ad gördüğünüzde, tanımının basit bir aramasıyla ilişkili değerin ne olduğunu bilirsiniz. Değişken değişkenleriniz varsa, yalnızca birkaç atamadan hangisinin en son yürütüldüğünü söyleyebilirsiniz, böylece kontrol akışını da analiz etmeniz gerekir, bu da koşullu olabilir ve sizi birden fazla olasılıkla bırakır. Üstel bir patlama elde etmek için sadece ödevlerin RHS'sinin kendilerinin değişkenlere bağlı olduğunu düşünmeniz gerekir, bu nedenle bunları tekrar tekrar analiz etmeniz gerekir.

Yukarıdaki analizdeki sonuç, amacı, değişmezleri ve anlambilimi açıklayan yorumlar olmaksızın savunulamaz olmasıdır: bunların yorumlanması zor olabilir ve anlambilimin gerçek kodda uyulduğunu doğrulamak zor olabilir.

Bu cevap temelde @ Javier'in 1. noktasının genişlemesidir.

Bence hileli OO rejiminin popülaritesinin bir açıklamasıdır: OO ile değişebilir durum kapsüllenir, bu da mutasyonları bir dereceye kadar lokalize ederek ve semantiklerin çok daha güçlü bir şekilde ifade edilmesine ve doğrulanmasına izin vererek analizi çok daha kolay hale getirir.

Bunu kaydettikten sonra, fonksiyonel programlama cevap değildir. Doğru cevap, hem endüktif (fonksiyonel) hem de koindüktif (prosedürel) programlamayı destekleyen bir sistemdir, böylece doğru araçlar hem durumsuz hem de durumsal programlamayı işleyebilir. Devlet yapıcılığı teorisi hala emekleme aşamasındayken, sadece yapıcı (işlevsel) teori iyi kurulmuştur.


İşlevsel ve zorunlu programın karıştırılması tam olarak Haskell'in yaptığı şeydir - durumsal hesaplamalar, değişebilir durumu (diğer şeylerin yanı sıra) dikkatlice izole etmenizi ve kontrol etmenizi sağlayan yapıyla gösterilebilir. Bu yüzden en pratik STM uygulaması olan dil Haskell'dir .
Tikhon Jelvis

-Notasyonu musunuz gerçekten durum bilgisi hesaplama ilgisi yoktur se başına . Gösterim, monadik fonksiyon boru hatlarının üstünde daha basit bir sözdizimidir. Durumsal hesaplama sadece monadlar kullanılarak ifade edilebilecek şeylerden biridir ve dolayısıyla gösterim.
Jonathan Sterling

Karma fonksiyonel ve zorunlu programlama, var olan her dilin yaptığı şeydir. Haskell, durum bilgisi olan parçaları izole etmek için bir yol sağlamış olabilir, ancak bu onu uygun bir karışım yapmaz: Hayır, daha çok nasıl olması gerektiği gibidir (IMHO).
Yttrill

2

Haskell'de yazılmış bir DBMS olan Siege'in yazarı olarak , bazıları değişebilir devlet hakkındaki görüşümü çelişkili olarak adlandırabilir. Başka türlü göstermeyi umuyorum.

Değişken durumun amacı, bir sistemin içinde bulunduğu durumu açıklamaktır. Bir blogunuz olduğunu ve bir veritabanı tarafından arka uç olduğunu, veritabanının sorguladığınız noktada blogunuzdaki yayınları açıklamasını sağlayın o. Şu anda kaç gönderi var?

Bunu, gerçekleri iletmek için kullanılan değişmez durumla karşılaştırın. 12 Ağustos'ta kaç yazı vardı?

Gerçekler hakkında akıl yürütmek kolaydır, değişebilir durum değildir. Bununla birlikte, değişebilir durum, aklımızın erişiminden uzaklaştırılması gereken kötü bir saf olmayan etki değildir; sık sık içinde yaşadığımız değişebilir dünyada bir arada var olmaya ihtiyaç duyarız, sadece daha az kullanmamız gerekir.

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.