İşlevsel dil sözdizimi neden insan diline daha yakın değil?


14

Fonksiyonel programlamaya ilgi duyuyorum ve Haskell ile başa çıkmaya karar verdim. Başım ağrıyor ... ama sonunda anlayacağım ... Ama bir merakım var, sözdizimi neden bu kadar şifreli (başka bir kelimeden yoksun)?

Daha etkileyici , insan diline daha yakın olmamasının bir nedeni var mı ?

FP'nin matematiksel kavramları modellemede iyi olduğunu ve bazı özlü ifade araçlarını ödünç aldığını anlıyorum, ama yine de matematik değil ... bir dil.


4
@ratchet freak: :) yani Lehçe gösterim nefret eden bir adam tarafından tasarlanmış bir tane var mı?
JohnDoDo

10
@ratchetfreak Haskell sözdizimi lehçe gösterimine ne şekilde benziyor? Haskell işleçleri tıpkı diğer dillerin operatörleri gibi (ve işlev çağrıları da önektir - diğer birçok dilin işlev çağrıları gibi).
sepp2k

10
Yaptığınız oldukça büyük bir varsayım / sıçrama, “insan diline daha yakın” ifadesinin “daha ​​anlamlı” olduğu anlamına geliyor.
Matt Ball

7
Hiç Cobol ve Fortran'ı duydun mu?
ott--

7
Matematikçilerin uzun latin ifadelerini cebirsel ifadelerle değiştirmesinin tam olarak aynı nedeni. Biraz pratik yaparak, daha kompakt bir gösterim çok daha üretken olur.
kevin cline

Yanıtlar:


14

Haskell ve önceki Miranda gibi fonksiyonel diller lambda hesabının matematiksel kavramından doğdu . Wikipedia sayfasından:

Lambda hesabı (λ-hesabı olarak da yazılır veya "lambda hesabı" olarak da adlandırılır), değişken bağlama ve ikame yoluyla hesaplamayı ifade etmek için matematiksel mantıkta resmi bir sistemdir.

...

Lambda hesabı programlama dilleri teorisinin gelişiminde önemli bir rol oynamıştır. Bilgisayar biliminde lambda hesabının en önemli muadilleri, esasen hesabı (bazı sabitler ve veri türleriyle zenginleştirilmiştir) uygulayan fonksiyonel programlama dilleridir. Programlama dillerinin ötesinde, lambda hesabı da kanıt teorisinde birçok uygulamaya sahiptir. Bunun önemli bir örneği, farklı tipte lambda hesabı sistemleri ile biçimsel mantık sistemleri arasında bir yazışma sağlayan Curry-Howard yazışmalarıdır.

Bu tarih nedeniyle, bu işlevsel dillerin sözdizimleri (ve daha zorunlu dillerin fonksiyonel öğeleri) lambda hesabı tarafından kullanılan matematiksel gösterimlerden güçlü bir şekilde etkilenmektedir.

Hem matematiksel gösterimlerin hem de bilgisayar dillerinin gereksinimleri tanımlayabildiği hassasiyet ve bilgisayarların talimatlarının yazılmasını istediği hassasiyet birbiriyle iyi ilişkilidir. Bununla birlikte, doğal dilin belirsizliği, bilgisayar programlama için büyük bir engel oluşturur. Wolfram Alpha gibi (tartışmasız) en başarılı Doğal dil programlama ortamlarının bile etkili bir şekilde kullanılması için önemli alan adı deneyimine ihtiyacı vardır.


30

Haskell sözdizimi olan insan diline yakın. Haskell'in üzerine inşa ettiği kavramları tam olarak ifade etmek için , insanlar (böylece bir insan dili ) tarafından tasarlanan bir dil olan matematiksel gösterime benzemek için özel olarak tasarlanmıştır .

Herhangi bir matematikçi veya mantıkçıya bir parça Haskell kodu gösterebilirsiniz ve Haskell'i daha önce hiç duymamış olsa ve programlama, bilgisayar bilimi ve hatta bilgisayarlar hakkında kesinlikle hiçbir şey bilmese bile bunu anlayabilecektir.

Öte yandan, herhangi bir matematikçi veya mantıkçıya böyle bir kod parçası gösterebilirsiniz:

x = x + 1

"hayır yoktur, bu mantıklı değil: o tamamen söyleyerek, şaşkın olacak xşekilde xeşit xartı 1."

Belirli bir gösterimin "şifreli" olup olmadığı, bir fikir ve aşinalık meselesidir.


8
Bu cevapla ilgili tek bir sorun var: Ben matematikçi değilim.
JohnDoDo

6
@ sepp2k: Katılmıyorum. Programlama dillerine ve bazı temel matematiksel altyapılara maruz kalmadan çoğu insan için Haskell sözdiziminin anlaşılması, tüm yan etkileri ve karmaşık ortam ifadelerinin yürütüldüğü tipik prosedür kodundan daha kolay anlaşılacaktır. Sözdizimi where, bir satırda bir işlev.
Benjamin Bannier

17
-1: bu cevap büyük ölçüde bilgiçlikçidir. OP'nin konuşulan dil anlamına geldiğinden oldukça eminim.
Steven Evers

6
Aslında, x = infinitybunun denklemi gerçekten çözdüğünden eminim .
DeadMG

6
Programlama dilleri de insanlar tarafından tasarlandı ... Yani sizin tanımınıza göre, bunlar insan dilidir.
marco-fiset

13

Sanırım muhtemelen karşılaştığınız bir şey, fonksiyonel programlamayı öğrenirken de karşılaştığım bir şey, yani fonksiyonel programlama ile, zorunlu programlama ile düşündüğünüzden daha yüksek bir seviyede düşünebilir / çalışabilirsiniz.

Daha az etkileyici bulduğunuz şey, aslında daha etkileyici olduğunu düşünüyorum : her küçük detayı hecelemek zorunda değilsiniz ve fonksiyonel programlamada daha az kodla daha fazlasını yapabilirsiniz - yazdıklarınız için daha fazla güç var.

Örneğin, zorunlu olarak yazabilirim:

for each (Person person in people)
    print(person.name)

İngilizce olarak tamamen okunabilir.

Bir Haskell sürümü olabilir (ve bu geçerli Haskell değil, sadece sözdizimsel karşılaştırma içindir):

map (print . name) people

hangi daha az kod ve daha az detay wrangling gerektirir - Ben bir döngü ve değişken (ler) ( for each (...)) şeyler yıkmak zorunda değilsiniz , mapfonksiyon benim için bununla ilgilenir.

Bu seviyede çalışmak alışmak biraz zaman alabilir. Eğer yardımcı olursa, Haskell muhtemelen programlamaya başladığımdan beri yeni bir dil öğrendiğim en zor zamandı ve> 10 dil (Lisp dahil) biliyorum. Yine de öğrenmeye değerdi.


8

Şu anda Scala ile başa çıkıyorum, böylece sempati duyuyorum. En azından Scala ile işler çok zorlaştığında zorunlu bir tarza geri dönebilirim.

Sanırım burada oynayan birkaç güç var:

  • İşlevsel dillerin tasarımcıları mutlaka güçlü bir matematik geçmişine sahiptir, bu yüzden kendileri için doğal olan matematiksel gösterimi ödünç alırlar.

  • Herhangi bir dilin daha fazla ifadesi (yani, İngilizce'ye yakınlıktan ziyade ifadelerin gücü), öğrenme eğrisinin dikliğinde karşılık gelen bir fiyata (IMO) sahiptir. Terseness, Scala'da birçok şey isteğe bağlı olmak üzere oldukça değerli bir kalitedir.

  • İşlevsel diller işleri çok farklı yapar, bu nedenle temel işlemler zorunlu yapılarla eşleşmez.


3
Ben de sık sık fonksiyonel diller yüksek mertebeden kavramları ifade edebilir eklersiniz, bu varlık daha soyut, anlamlı isim zordur
jk.

1
@jk, evet, kabul etti! Aynı zamanda, zorunlu arka planı ve az matematik (benim gibi) olan programcılar için dik bir öğrenme eğrisine sahip olmaları ve neden değerli olduklarını.
Richard Close

3

Son yorumunuzu doğru bir şekilde anladıysam, sorunuz Haskell'in neden alfasayısal anahtar kelimeleri (veya işlev adlarını) kullanabileceği yerlerde sık sık sembolik operatörler kullanıyor?

Anahtar kelimelerle ilgili olarak bir yanıt, anahtar kelimelerin belirli kelimeleri değişken adları olarak kullanmanızı engellemesidir. Örneğin, değişkenlerimi çağırmak istediğimde fromve tobunlardan birinin Python'daki gibi bir anahtar kelime olduğu dillerde her zaman rahatsız oluyorum .

Genel olarak sembolik operatörlerin bir başka nedeni kısaltmadır. Bu, liste kavrama örnekleriniz için geçerli <-değildir (daha kısa değildir in), ancak çoğu durumda geçerlidir.

Yine bir başka neden de okunabilirlik. Bu sezgisel görünebilir, çünkü sembolik operatörlerin öğrenmesi genellikle daha zordur, çünkü "isimleri" ne yaptıkları hakkında gerçekten bir şey söylemezler (bir fonksiyonun adı genellikle olur), ancak belirli bir operatörün ne yaptığını bildiğinizde, infix sembolik işleçleri olan ifadeleri çoğu zaman bir insan için ayrıştırmak daha kolaydır, çünkü işleçler bu şekilde işlenenlerden görsel olarak daha kolay ayırt edilir. Örneğin, çoğu insan bunun veya ' 2 * 3 + 4dan daha kolay okunabilir olduğu konusunda hemfikirdir .add (mult 2 3) 4add(mult(2, 3), 4)


@PeterTaylor Hayır, sadece aptal olduğum ;-) Şimdi düzeltildi.
sepp2k

3

Zorunlu bilgisayar dilleri, doğal dillere çoğunlukla Haskell'den daha yakın değildir.

Ancak, bazıları İngilizce'ye daha yakından benzeyecek şekilde tasarlanmıştır: Örneğin, Cobol ve Hypercard. Bu örneklerden alacağım dersler:

  • doğal dillere benzerlik, kullanılabilirlikte doğrudan gelişmeler sağlamıyor gibi görünmektedir
  • doğrudan doğal dilleri taklit etmek, ayrıntılı ve belirsiz bilgisayar dilleri verebilir

Perl bilgisayar dilinin, doğal dilin bazı daha ince yönleri göz önünde bulundurularak tasarlandığı bildirildi . Perl'in genel kullanılabilirlik konusunda Cobol veya Hypercard'dan daha iyi yaptığını yargılarım, ancak insanların Perl hakkında farklı görüşleri var.


3

Bence Haskell çılgın bir sözdizimi getirmeden insan diline benziyor. Örneğin, wherebir tanımı erteleme yan tümcesi ve tam olarak bir tahtaya yazacağım liste anlama sözdizimi ile bu konuda büyük çaba sarf ediyor. Ayrıca parantez gibi yabancı karakterlerden kaçınır ve liberal bir girinti kullanır. Tipik örnek hızlı sıralamadır:

qsort [] = []
qsort (p:xs) = qsort lesser ++ [p] ++ qsort greater
               where lesser = [x | x <- xs, x <= p] 
                     greater = [x | x <- xs, x > p]

Kabul ediyorum, basit bir örnek, ama onu olduğu gibi okunabilir hale getiren başka bir dil bilmiyorum.

Haskell'de daha karmaşık şeyler yapmak zor olabilir, ancak bunun sözdizimi ile değil, tip sistemi, kısıtlı IO ile ilgisi vardır.

Bir şey olursa, Haskell'in insan diline daha benzer bir sözdizimini barındırmak için sözdizimsel sadeliği feda ettiğini söyleyebilirim. Şema gibi bir dil, bir insanın yazacağı şeyden çok uzak bir sözdizimine sahiptir, ancak kurallarını açıklamak gerçekten basittir.


3
Buna insan tarafından okunabilir diyemem. Ben biliyorum quicksort. Birden fazla farklı dilde nasıl ayarlayacağımı biliyorum, ne yapması gerektiğini biliyorum ve hala bu kod snippet'inin alt yarısından başları veya kuyrukları yapamıyorum.
Mason Wheeler

Sanırım bu gerçekten sizin geçmişinize bağlı. Bu benim için alır gibi düz ...
Andrea

2
Her durumda, bu gösterime benzemesi gerekiyor: purplemath.com/modules/setnotn.htm
Andrea

4
Olmaması gerektiğinden emin misin ++ [p] ++?
Peter Taylor

1
@Mason: Benim için oldukça açık görünüyor ve asla bir Haskell satırı yazmadım
kevin cline

2

Ben fark işlevsel / bildirim programlama yapar yolu ile ilgisi var ifadeleri zorunlu programlama açıklar gibi bir matematik problemi var sanki bir sorun hakkında, süreci . İş dünyasında, bilgisayar programları fiziksel süreçleri sarar veya değiştirir, böylece bunu daha sezgisel olarak yansıtan bir dil bulabilirsiniz.

İşlevsel stilin, birden fazla işlemciyi güvenli bir şekilde kullanmaya başladığı ortaya çıkıyor (çünkü değişebilirliği ve yan etkileri en aza indiriyor) - gelecekte daha fazla göreceğimiz bir şey. Ayrıca, modern işlev dillerinin çoğunda işlevleri iletebileceğiniz yineleyiciler içeren koleksiyonlar vardır. Bu yöntemler, iş yükünü bilmeden bile çok işlemcilere çok verimli bir şekilde bölebilir.


Bence bu en iyi cevap - süreç ve ifadeler arasındaki ayrımı açıkça ortaya koyan tek cevap.
Milind R
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.