Geliştirme ortamınıza fonksiyonel programlamanın getirilmesi [kapalı]


15

Bu uzun bir hikaye ama bunu elimden geldiğince özetlemeye çalışacağım. Biz çeşitli fon türleri için yazılım yazan bir .NET mağazasıyız. Örneğin, sağlık talep yönetimi yazılımı, emeklilik yönetimi yazılımı, 401 (k) yazılımı ve diğer bazı finansal tür şeyler yazıyoruz.

Şimdi yeni bir alana giriyoruz: türevler ve niceliksel analiz türü iş, çok heyecan verici görünüyor. Bu, önümüzdeki 8-12 ay içinde bana inen bir şey.

Şimdi, kendi başıma bazı fonksiyonel programlama öğrendim, esas olarak bu kitap aracılığıyla çeşitli dillerde yüzeysel bakışlar ama asla gerçekten derinlemesine araştırmadım. Şimdi, bir .NET mağazası olduğumuzdan F #'ın iyi bir seçim olabileceğini düşünüyordum, çünkü muhtemelen bazı .NET kitaplıklarından ve mevcut bilgilerden yararlanabiliriz.

Sorum şu, nereden başlamalı? Haskell, Erlang, Scala, F #, vb.

Benzer bir durumu olan var mı? Eğer öyleyse, işlevselliğe geçme deneyiminiz neydi ve neyi seçtiniz ve neden? Bunun büyük bir soru olduğunu biliyorum ama şu anda fonksiyonel yöntemler kullanan herhangi bir geliştirici bilmiyorum, bu yüzden sürekli Googling'den ve en iyi fonksiyonel dilde her yerde alev savaşları bulmaktan başka bir yerim yok.


önerilen okuma: Nereden başlamalı
gnat

Yanıtlar:


14

Prototip, prototip, prototip! Fonksiyonel programlama gerektirdiğini düşündüğünüz bir iş işlevselliğini alın ve çeşitli dilleri deneyin ve aradığınız faydaları ve birlikte çalışabilirliği gerçekten sağlayıp sağlamadıklarını görün.


İyi tavsiye ve ben buna kulak vereceğim, aslında şu anda bir Erlang kurulumu yapıyorum.
Nodey Düğüm Adamı

10

Gerçekten doğru cevaplamanız gereken ilk soru, neden işlevsel bir dil kullanmayı düşündüğünüzdür. Geçiş için bir iş nedenini haklı çıkaramazsanız, bunu yapmamalısınız. Diğer bir deyişle, çalışma ortamınıza yeni bir çerçeve, dil veya başka bir yeni teknolojiyi tanıtmak, sadece öğrenmek istediğiniz veya bir sonraki “havalı” şey gibi göründüğü için kesinlikle bir hatadır. Bu yüzden önce kendinize motivasyonun ne olduğunu doğru bir şekilde sormanız gerekir.

Belirli bir sorunu çözmek için gerçekten işlevsel bir dile ihtiyacınız olduğunu düşünüyorsanız ve genel fonksiyonel dillerin çoğunun gereksinimlerinizi karşılayacağını varsayarsak, en olgun ve en büyük kullanıcı topluluğuna sahip olanlarla giderdim. Erlang iyi bir seçimdir ve bu gereksinimlerin her ikisini de karşılar, ancak tamamen ms / .NET ortamında F # kullanarak anlayabilirim.


2
@ennukiller - Fonksiyonel programlamanın bizim için iyi bir seçim olacağını kesinlikle görebiliyorum ve yalan söylemeyeceğim. Çok miktarda hesaplama yapacağız ve çok çekirdekten yararlanmak istiyorum. Ayrıca, her matematiksel fonksiyonun doğru olarak kanıtlanması zorunludur, bunun fonksiyonel ile daha kolay olabileceğini anlıyorum.
Nodey Düğüm Adamı

2
Kanıtlara ihtiyacınız varsa, saf fonksiyonel programlama en iyisidir. Buradaki bazı öneriler, zorunlu diller için işlevsel eklentiler içindir - daha tanıdık olabilir, ancak size kanıtlanabilir şekilde doğru kod vermeyecektir. Yan etkilerin varlığında, x = x ('referans saydamlığı') gerçeğini kullanamazsınız ve koddaki daha sonra x'in daha önce olduğu gibi hala aynı değeri taşıdığını kanıtlamanız gerekir. Örneğin bazı dillerde, 6 olmayan ve 10 olmayan x:=3; y:=10; x:=add(x,x);bir sonuç ortaya çıkabilir . Bu bağlamda işlevlerinizin doğru olduğunu kanıtlamak pratik değildir. xy
AndrewC

9

Varolan bir Java kod tabanına sahip bir mağaza için Scala ile kesinlikle aynı fikirde olduğumdan, mevcut bir .Net kod tabanına sahip bir dükkan için F # ile kesinlikle katılıyorum.

Fonksiyonel programlama, diğerleri gibi bir araçtır. İyi kullanıldığından ve zaten kod geliştirme şeklinize entegre edildiğinde, kodunuzun ne yaptığına dair mantık yürütmeyi kolaylaştırarak sizi daha üretken hale getirebilir. Bununla birlikte, dilleri değiştirmek ücretsiz olmaktan uzaktır, bu nedenle en iyi bahsiniz, mevcut kodunuzu mümkün olduğunca uzun bir süre geçişe kullanmanızı sağlayan bir çözümdür. Ne de olsa, ortamınıza yeni bir dil eklememenin en kesin yolu, iş arkadaşlarınıza, bu noktada bir değişikliğin faydalarını görmek için şimdiye kadar sahip oldukları her şeyi yeniden yazmaları gerektiğini söylemek olacaktır. hala onları satmaya çalışıyorsun.


7

Ben işlevsel programlama başlayan öneriyoruz olmadan da hemen yeni bir dil öğrenmek. Yeni bir dilin sözdizimi ile başa çıkmaya çalışırken yeni bir paradigma öğrenmeye çalışmak daha da zorlaşır.

Elbette, fonksiyonel programlama yapmak için özel olarak geliştirilen diller bazı avantajlara sahip olacaktır (kavrama ve veri yapılarını varsayılan olarak değiştirilemez gibi belirli yapılara sahip olmak gibi), ancak genel olarak yapmanın en büyük adımı, düşüncelerinizi bir işlevselliğe dönüştürmektir. tarzı. C # bunu yapmak için mükemmeldir.

Temel olarak, kodunuzun durumunu değiştirmeyi bırakırsınız. Java kullanarak bunu yaptım ve lambdas var çünkü C # ile daha da kolay. Bu tarzın asısını ve ne için iyi olduğunu hissettikten sonra, işlevsel bir dil almak (F # seçtiğiniz veya Erlang'dan bağımsız olarak) çok kolay olacak ve onunla son derece üretken olacaksınız.


1
+1: Sana katılıyorum. Ayrıca Java ve C ++ (daha son ve const değişkenleri kullanarak, işlev kompozisyonu kullanarak karmaşık işlem kesilmesi, vb.) Daha işlevsel bir tarzda kodlamaya başladım. Bu, Java ve C ++ 'da programlama tarzımı kesinlikle geliştirdiğini düşünüyorum. Bir süre sonra, kişi daha ileri gitmeye hazır olduğunda, fonksiyonel bir dil deneyebilir (Haskell, Ocaml, SML, Lisp, Scala, F #, vb.)
Giorgio

1

İstediğiniz tek şey işlevsel programlamayı öğrenmek ve anlamaksa, IronPython'u yükleyin ve Python'daki işlevsel özelliklere odaklanın. En kötüsü, bir uygulamadaki kod satır sayısını azaltmak ve programdan önce daha fazla hatasız ürün sunmanıza yardımcı olmak için C # ile entegre edilebilen bir araç öğreneceksiniz.

Python'daki fonksiyonel yaklaşımların karmaşık şeyleri nasıl basitleştirebileceğine dair bir örnek için DaBeaz'ın jeneratörler hakkındaki sunumlarına bir göz atın http://www.dabeaz.com/generators/

Bunun dışında Scala ile biraz zaman geçirmenin akıllıca olacağını düşünüyorum. Beta modunda beta modunda çalışır, bu yüzden yükleyebilir ve bugün öğrenme amacıyla kullanabilirsiniz ve sonbaharda .NET için yayın modunda olacaktır. Bu, Scala'da JVM ve .NET arasında taşınabilir olan kod yazabileceğiniz anlamına gelir. Ve Scala, Aktörler ve mesaj geçişi üzerine kurulu olduğundan, birkaç ayrı makinede çalışan birkaç ayrı programdan yapılmış bir uygulama oluşturmak çok, çok kolaydır. .NET / JVM taşınabilirliğini karışıma eklediğinizde, dikkate alınması gereken başka bir özellik vardır. Hem iletişim kurabilmeleri için protokoller geliştirmekle uğraşmadan hem 3. taraf Java kitaplıklarından hem de 3. taraf .NET kitaplıklarından yararlanan bir uygulamanız olabilir. Her iki süreç de Scala'da yazılacaktı, ve iletişim kurmak için Scala uzaktan mesajlaşmasını (uzaktan aktörler) kullanırdı. Sonunda Scala'nın Typesafe.com'un ne yaptığını değerlendirerek standart kütüphanesinin bir parçası olacak gibi görünen Akka kütüphanesine göz atın.


+1: Scala ve farklı platformlardaki kullanılabilirliğinden bahsettiği için. Soru: Akka Scala'daki mevcut aktör uygulamasının yerini alacak mı? Yoksa ikisi yan yana mı olacak?
Giorgio

Akka'nın yakında Scala oyuncularını değiştirip değiştirmeyeceğinden emin değilim, ancak Scala yaratıcısı Martin Odersky Typesafe şirketinde Akka yaratıcısı Jonas Boner ile katıldı. Scala'yı Akka ve şimdi Play çerçevesi ile yoğun bir şekilde tanıtıyorlar. Dolayısıyla, kalkınmanın odağının Akka üzerinde olması muhtemeldir. Sadece Scala ile aktörleri öğreniyorsanız, öncelikle Akka'ya odaklanmak en iyisidir.
Michael Dillon

Bilgi için çok teşekkürler! Scala'daki oyunculara bir göz attım ama şimdiye kadar sadece çok yüzeysel olanlara baktım.
Giorgio

-1

Kabul edilen cevabın ana itişine kesinlikle katılıyorum ve temel olarak Erlang'ı deneyerek bir şeylere daltığınız göz önüne alındığında, muhtemelen nasıl öğrendiğinizi oldukça iyi anladığınız ve sağda biraz dürtmeye ihtiyaç duyduğunuz gibi geliyor açıkça, bu sizin için iyi bir cevaptı ... Ama sanırım bu soruya biraz farklı yaklaşacağım, çünkü bu cevabın bana pek yardımcı olmayacağını görüyorum; Ben her zaman öğrenmek için kod! İşte düşüncelerim ...

(BTW, bir kitaptaki bölümler için daha ayrıntılı olarak devam etme eğilimindeyim ve eminim içgüdülerimi burada tamamen boğamıyorum , ama farklı bir çakışma deneyeceğim; sadece düşüncelerimi burada özetleyecek ve birisinin herhangi bir şey hakkında daha fazla ayrıntı istemesi veya söylediğim bir şeyin bu biçimde yanıltıcı olduğunu düşünmesi durumunda, yanıt hatırlatıcılarından geçmeyi hatırlamak için elimden geleni yapacağım ...)

Kendimi görevde tutmaya çalışmak için burada OP'de sorulan itme sorularını anladım; Açıklamak için gerektiğinde kenar çizgilerini minimumda tutacağım ....

Önce hızlı cevaplar:

benzer bir durumdaydım? En azından benzerdi; Bununla ilgili birçok farklı proje yapıyorum ... (CRM / Web / DB / Veri Entegrasyonu / vb.)

nasıl / neden fonksiyonel atlamak yaptım? " Bazı LINQ örnekleri gördüm ve kesinlikle bir tür entegre, statik olarak yazılan, sorgu dil hayal ettim (öncelikle statik olarak yazılan diller (öncelikle C ++ ve daha sonra C # kullandım gibi) )] kariyerim boyunca ... Ama, içinde bulunduğum oldukça hızlı ateş eden bir ortamdı ve geçmişte ne olduğunu sık sık görsem de, bunu gerçekten hiç düşünmemiştim, Düz Eski Nesneler (lol!) üzerinde işlemlere kolayca izin verebilirim / izin verebilirdim; gördüğümde ona sahip olduğumu biliyordum ... bu yüzden ve bunun nasıl başladığı: LINQ'yu anlamayı öğrenmeye odaklandım .

Dört Düşünce ... errr, hayır bu doğru değil ...

Martijn Verburg'un cevabını okuduğumda , işlevsellikten bahsetmek, üzerinde çalıştığım her şeyin kodunu uygulamaya başlamaya hemen aklımı getiriyor ... İlk denemenin ne kadar sığ olduğuna bağlı olarak farklı cevap verebilirim, ancak sadece ayak başparmağınızı daldırdığınızda, doğrudan iş için (ya da yakında iş olacak) bana heyecan / tutku sağlayacak bir şeyim olduğundan emin değilim. ...

Neredeyse tamamen statik olarak yazılmış dillere + OOP metaforlarına ve kalıplarına + dayanıyordum. Yıllar boyunca gerçek problemlerimi çözerken beynimi yanlışlıkla sardım ne olduysa ... muhtemelen LINQ / FP ile size bu kadar yardımcı olmayacak şeylere adanmış çok fazla beyniniz var.

Eğer OOP'deki kullanarak sona erecek prosedürel bir sürü var, bunlarla bunu bir öncelik yapmadan C ++ C gelenler: Ben biraz saf prosedürel vs OO programlama gibi düşünmeye grok / ken / "get" OO C ++ 'da çok kötü oluyor. Aslında C ++ 'ı bildiğini gerçekten düşünen , ancak en fazla C ++' dan çok basit bir temel / ders kitabı anlayışına sahip olan ve neredeyse hiç anlamadan çok fazla (15+) uzun süreli yazılım ve cihaz sürücüsü geliştiricisi ile röportaj yaptım . OOP deneyimi - çünkü aslında hiç OOP yapmadılar ... Yapısal olarak kullanılan statik olmayan ve tekil olmayan sınıflarla bir miktar statik üyeli ve statik fonksiyonlarla tektonlu çok amaçlı sınıflar yazdılar.

FP'nin de benzer şekilde zihin bükme (paradigmada gündeme gelmeyenler için) kavramları ve onunla birlikte gelen diğer şeyleri var ve (benim için ideal olacak birçok tekniğin hibridizasyonunu bulduğum halde) daha fazla anlıyorum ve daha çok zaman geçtikçe, araç setime gerçek işlevsel yetenekler eklemeden önce düşüncem tam olarak ne kadar sınırlıydı; Geçmişte pek çok şeyi belki de çoğu OO programcısından biraz daha yaratıcı bir şekilde uygulamayı başardım, ama düşüncelerimin daha önce ne kadar bodur olduğu kavramlarını kullandığımda ... Çözülebilecek tüm problem sınıfları var C ++ / C # 'da yapmak için çok fazla eğme cehennemi almak için kullanılan birkaç satırda.

aniden kendini bulursun ...

"Çok Uzun" Bir Gönderi

Bir bükülme "okumadı" labirentindesiniz, hepsi aynı.

Yakın gelecekte, hızla yaklaşan bir telekonferans görüyorsunuz.
> veciz
HI-hı. Elbette. Tamam, "kısa" modun "açık" olduğunu söyleyeceğiz.

Yakın gelecekte, hızla yaklaşan bir telekonferans görüyorsunuz.
> bunun anlamı ne?
Sadece söylüyorum'. Bu sabah bir şey yapmak zorunda kalmadın mı?

Yakın gelecekte, hızla yaklaşan bir telekonferans görüyorsunuz. 
> hey, arkanda bir yulaf ezmesi mi?
Ne!? NEREDE?! [çığlık atıyor]

> Maalesef NEREDE NEREDE anlamadım, yeniden ifade ettim?
[koşmaya ve çığlık atmaya devam etti, alaycılık fark edilmedi]

Peki ... Ne öğrenmeliyim, sevgili PSE, sevgili PSE?

Şahsen C # ile LINQ ile başladım. Her seferinde birkaç kavram tanıtmama izin verdi ve sürekli FP ve kavramları ve daha fazla LINQ ve ikisi arasındaki ilişki hakkında okurken, üretken işler yaparken bana bir yol verdi. Bir seferde birkaç şey ekledim, veri sorguları bir tonu anlamak zorunda kalmadan hızlı bir şekilde bana yararlı bir araç haline geldi.

Şimdi, geriye dönüp baktığımda, önce bir sonraki projemi (yaklaşık bir yıl sonra ele aldım) yapabilseydim; F # ile orta derecede aşina oldum (bu arada, bana ML (metalangu) öğrenmeye büyük bir başladım ve diğer türevler (örneğin, OCaml .)

Temel olarak, 'neye' iyi bir cevap, sizi ilgilendiren bazı programlama problemleri ile iyi bir eşleşme bulmaya bağlı olduğunu düşünüyorum, ancak elbette öğrenmek istediğiniz bir miktar FP ile eşleşmelidir ... (ve durulayabilirsiniz / listeden bir şey çaldıktan sonra tekrarlayın / köpürtün ...) Ve elbette, her zaman yapmak için ayarladığınız ana şeyden biraz daha fazlasını öğrenirsiniz; ilk başta bazı bebek adımları attım, ama sonra daha büyük şeyler yaptım ve bunları yaparken daha küçük şeylerin yerine oturmasına izin verdim.

İlk olarak, teknenizi ne yüzer? Özellikle ilk başta (sizin için) eğlenceli ve heyecan verici bir şeye sahip olmak en iyisidir ve bu sizin ilginizi sizin için değerli kılacak kadar tutacaktır. Yani, üzerinde çalışmak için IOW sorunları ve bu sorunları ele teknikler ... LINQ ve benim için ilk satır içi veri sorgulama. Özyineleme benim için başka bir şeydi, kuyruk özyineleme de dahil olmak üzere, GodelEscherBach-ness'i kazıyorum; ve kuyruk özyineleme hakkında okuyordum. Bu süre zarfında üzerinde çalıştığım şeyler beklemeye alındı ​​ve büyük bir zaman bloğuna sahip oldum, bu yüzden uzun süre devam edebildim. Daha az kesintiyle daha kolaydı, ama eğlenceli olduğunu düşündüğüm şeyleri seçtiğim için, işin kesilmesiyle bile o kadar da zor değildi. :)

Kendimi tanıyan Yengeç Programı gibi size anlatabileceğim güzel bir şey bulamamam da, oldukça iyi başardım.

Ve ... Ne ile öğreneyim, sevgili PSE, sevgili PSE, neyle?

Bunun için, zaten ilgilendiğim çeşitli algoritmalar kullandım, artı F #'da yapabileceğinizi merak ettiğim çeşitli şeyler ve fikirlerim tükendiğinde 99 şişe bira ve Project Euler gibi şeylerle uğraşardım sorunlar ...

FP'nin ilginizi çeken birçok şeyi bulacağınızdan eminim; geliştirmelerden OOP'a kadar her şeyi, daha önce düşündüğünüz şekilde tanımadığınız ve muhtemelen ifade edecek zihinsel modele sahip olmayan bir şekle çevirmek için biraz daha özlü bir şekilde belirtmenize yardımcı olan her şeyi sunar. önce.

Ama ... Modelimde bir delik var, sevgili PSE'ye bir delik ...

Ve bu yüzden, özellikle başlangıçta, ama gerçekten öğrenme süreniz boyunca (ve bir şey öğrenirken her zaman doğru değil mi?) Bu yüzden en azından ilgisiz şeyleri okumak için problemler arasında biraz zaman ayırmanız önemlidir, ancak hala FP ve uzmanlar tarafından yazılan kaynak kodunu okuma, tercihen aynı veya benzer problemleri çözme zamanı; şeylerin açıklamaları kadar ...

Ve tüm bu süre boyunca, eski bakış açınızdan değil, FP'nin kendisinden, hepsini anlamak için beyninizi zorlamalısınız ... Benim için bir noktada, tıkladı ve ... en iyi ilişkilendirebileceğim şey Hollandaca'da az çok akıcı hale geliyor; bir noktada kendimi zihniyete yeterince koymayı başardım (bunu daldırma yoluyla yaptım, temelde burada tarif ettiğim şey; sadece "kitap larnin" yoluyla öğrenmeye çalışmak yerine kendinizi FP'ye daldırmak ...

Ve sonunda yaptım; Her şeyi içselleştirmeyi başardım ve beynimi, OOP'a geri çevirmek için çaba harcamadan FP / LINQ'yu patlatmaya başlayana kadar etrafta büktüm. (Evet bunu yaptım; eteğimi asacak bir şeyim vardı. Şapka. Her neyse.)

Son düşünceler...

Benim, benim, akıllıca imza düşünme yeteneğini kaybediyorsun
bölüm başlıkları. Ne utanç.

Telekonferans hâlâ hızla yaklaşıyor. Şimdi çok daha büyük görünüyor.
> evet, evet, iyi .. kısa ve hepsi. Görüyorum ki bu yiğitliği kaybetmeyi başardın.
 yakın çağrı, bu ... şey, evet, ter olmak ... OH HAYIR GERİ!
AAAAAAAHHHHHH !! [bir kez daha çığlık atıyor]

Telekonferans hâlâ hızla yaklaşıyor.
Bir şekilde Sir Lancyjohn Cleezewiz'i andırıyor.
Neredeyse üzerindedir.
> hey, acele et! Seninle deneyecek bir deneyim var! (ve bir po-ta-to)

Doğal olarak FP hakkında online bilgi bulabilirsiniz. Önemli olan temel kavramları anlamak ve bunları uygulamayı öğrenmektir. Örneğin, değişmezliği ve FP için neden önemli / yararlı olduğunu öğrenin. Saf FP'nin resmi kanıtlara ne kadar daha uygun olabileceği gibi, her şeyle birlikte gitmek için küçük bir teori öğrenmenizi şiddetle tavsiye ederim. Bu, F # 'nin öncüsü ML'nin arkasındaki itici bir güçtü. YMMV elbette gözyaşlarından sıkılmış biri olabilirsiniz, bu durumda, kullanılan tekniklerin tam olarak neden olduklarını görmek için çok sayıda örnek, çok sayıda deneme yanılma , 'Aha!' ampul anı.

Şimdilik bırakacağım. Umarım bu birileri için yararlıdır. Öğrenmek için belirli şeylere biraz daha girmek istedim ama şimdilik zamanım kalmadı. Umarım benim için uzun bir hafta olmak istiyor, ancak en azından hafta sonu olacak, ancak kısa süre sonra geri almak için biraz zaman bulacaksınız.

<3 "Bir durma boşluğu olan GRUEBOL ile tanışın; SnozzML bitene kadar. Yakında olmalı; Bu sefer bana yardımcı olan büyük bir komitem var." --Grace Hopperwit Yumurta, Ünlü Son Kelimeler , XX97 GUE <3


"sevgili SO" nedir?
gnat

sevgili yığın taşmasıydı; 'Kovada Bir Delik Var' şarkısının ritmine uyması gerekiyordu xD
shelleybutterfly

SO nakledilen dışında, bu zor puanlarınızı yapmak gibi görünüyor zaman anlamak - düşünün düzenlemek bunun için hesaba ing
tatarcık

derp! evet, gerçekten yaptık. tyvm. :)
shelleybutterfly

cevabımı nasıl geliştireceğime dair bir önerisi varsa, bunu takdir ediyorum. Kötü mizah mıydı? ya da kötü tavsiye? aslında benim deneyimlerime dayanıyor, bu yüzden daha kullanışlı hale getirebilirsem değiştirmekten mutluyum. teşekkürler;)
shelleybutterfly
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.