İşlevsel GUI programlama mümkün müdür? [kapalı]


404

Geçenlerde FP hatasını yakaladım (Haskell öğrenmeye çalışıyorum) ve şimdiye kadar gördüklerimden çok etkilendim (birinci sınıf fonksiyonlar, tembel değerlendirme ve diğer tüm güzellikler). Ben henüz uzman değilim, ama zaten temel algoritmalar için (işlevsel olarak geri gitmekte sorun yaşıyorum) zorunluluk olarak "işlevsel" akıl yürütmek daha kolay bulmaya başladım.

Bununla birlikte, mevcut FP'nin düz düştüğü bir alan GUI programlamasıdır. Haskell yaklaşımı, zorunlu GUI araç setlerini (GTK + veya wxWidgets gibi) sarmak ve zorunlu bir stili simüle etmek için "do" bloklarını kullanmak gibi görünüyor. F # kullanmadım, ancak benim anlayışım, .NET sınıfları ile OOP kullanarak benzer bir şey yapıyor olmasıdır. Açıkçası, bunun iyi bir nedeni var - mevcut GUI programlama tamamen IO ve yan etkilerle ilgilidir, bu nedenle mevcut çerçevelerin çoğunda tamamen işlevsel programlama mümkün değildir.

Sorum şu ki GUI programlamaya işlevsel bir yaklaşım mümkün mü? Bunun pratikte nasıl görüneceğini hayal etmekte zorlanıyorum. Herkes deneysel veya başka türlü, bu tür bir şey deneyen (hatta işlevsel bir dil için sıfırdan tasarlanmış çerçeveler) biliyor mu? Yoksa çözüm GUI parçaları için OOP ve mantık için FP ile sadece melez bir yaklaşım kullanmak mı? (Ben sadece meraktan soruyorum - FP'nin "gelecek" olduğunu düşünmek isterim, ancak GUI programlama oldukça büyük bir delik gibi görünüyor.)


7
Common Lisp ve OCaml'deki GUI'lere baktığımda, büyük olasılıkla, Haskell'in soruna neden olan tembellik olduğunu söyleyebilirim.
yeni123456

5
@ new123456 Common Lisp işlevsel bir dil değil, değişken verilerle çalışıyor ve yan etkileri kucaklıyor
Electric Coffee

3
@ElectricCoffee Lisp, birçok farklı tarzda kullanılabilen son derece esnek bir dildir ve birçok insan Lisp'i işlevsel bir tarzda kullanmayı seçer.
chrismamo1

7
Deneyimlerime göre (hala inanmaya ve daha fazla öğrenmeye çalışıyorum) FRP gerçekten GUI programlama ile sınırına ulaşıyor; kullanım durumlarının% 80'i için güzel ve zariftir, ancak zengin widget'lar kendi iç durumlarının (örn. arama birleşik kutuları vb.) çok hassas bir şekilde kontrol edilmesini gerektirir ve FRP sadece engel olur. Zorunluluk her zaman kötü değildir; Zorunlu kod miktarını en aza indirmeye çalışmak iyi ama% 100'ü kaldırmak? Önemsiz UI gelişimi için işe yaradığını henüz görmedim.
AlexG

8
@ElectricCoffee "Ortak Lisp işlevsel bir dil değil". Lisp, tüm işlevsel dillerin annesidir. Yani Lisp saf değil.
Jon Harrop

Yanıtlar:


183

Haskell yaklaşımı, zorunlu GUI araç setlerini (GTK + veya wxWidgets gibi) sarmak ve zorunlu bir stili simüle etmek için "do" bloklarını kullanmak gibi görünüyor

Bu gerçekten de "Haskell yaklaşımı" değildir - zorunlu GUI araç setlerine en direkt olarak - zorunlu bir arabirim üzerinden nasıl bağlanırsınız. Haskell oldukça belirgin bağlara sahip.

GUI'lere, çoğunlukla Haskell'de ve öncelikle fonksiyonel reaktif programlama kullanılarak, orta derecede olgunlaşmış veya daha deneysel tamamen işlevsel / beyan edici yaklaşımlar vardır.

Bazı örnekler:

Haskell, Flapjax, http://www.flapjax-lang.org/ hakkında bilgi sahibi olmayanlarınız için JavaScript'in üstünde işlevsel reaktif programlama uygulamasıdır.


32
Tekniğin ve kararların harika, derinlemesine bir açıklaması için Conal Elliott'un meyve hakkındaki makalesine bakın: conal.net/papers/genuinely-functional-guis.pdf Birkaç aydır bu tarzda tamamen işlevsel GUI programlaması yapıyorum. . SEVİYORUM, zorunlu UI programlamanın spagetti cehenneminden bu kadar hoş bir rahatlama, ki bu açıdan en zorunlu programlardan daha kötü görünüyor.
luqui

44
% 100 buna katılıyorum. Bunu açıklığa kavuşturmak için: mevcut GUI araç takımlarının sıklıkla kullanılmasının nedeni, var olmalarıdır. Onlara arayüzlerin zorunluluk ve saf olmamalarının nedeni, araç takımlarının zorunluluk ve saf olmamalarıdır. Araç takımlarının zorunluluk ve saf olmamalarının nedeni, bağımlı oldukları işletim sistemlerinin zorunluluk ve saf olmamalarıdır. Bununla birlikte, temel olarak bunların herhangi birinin saf olmamasını gerektiren hiçbir şey yoktur : bu araç takımları için işlevsel bağlamalar vardır, fonksiyonel araç takımları vardır, hatta işlevsel işletim sistemleri bile vardır.
Jörg W Mittag

16
Hepsi sadece tembellik meselesi. (Kötü kelime oyunu.)
Jörg W Mittag

10
Bir gün tüm GUI tasarımı, mantık işlevsel olarak uygulanan WYSIWYG aracılığıyla uygulanacaktır. Bu benim tahminim.
BlueRaja - Danny Pflughoeft

23
Kağıt luqui bahsediyor ölü gibi görünüyor. Yine de Conal
aganders3

74

Sorum şu ki GUI programlamaya işlevsel bir yaklaşım mümkün mü?

Aradığınız anahtar kelimeler "fonksiyonel reaktif programlama" (FRP).

Conal Elliott ve diğerleri, FRP için doğru soyutlamayı bulmaya çalışmaktan biraz yazlık endüstrisi yaptılar. Haskell'de FRP kavramlarının birkaç uygulaması vardır.

Conal'ın en yeni "Push-Pull Fonksiyonel Reaktif Programlama" belgesiyle başlamayı düşünebilirsiniz , ancak bazıları haskell.org sitesinden bağlantılı birkaç başka (daha eski) uygulama vardır . Conal, tüm alan adını kapsayan bir ustalığa sahiptir ve makalesi, daha önce gelenlere referans olmadan okunabilir.

Bu yaklaşımın GUI gelişimi için nasıl kullanılabileceğine dair bir fikir edinmek için, 90'lı yılların ortalarında tasarlanan, bugünlerde dişte biraz uzarken , sağlam bir FRP yaklaşımı sunan Fudgets'a bakmak isteyebilirsiniz. GUI tasarımına.


Başlangıçta C # için yazılmış ve daha sonra Java (RxJava) ve JavaScript (RxJS) ve çeşitli dillere taşınan "Reaktif Uzantıları" (FRP Kütüphaneleri; ancak FP değil) kullanım artışını eklemek istiyorum. Reativex.io'ya bakın, Angular 2 RxJS'yi kapsamlı bir şekilde kullanıyor.
srph

63

Windows Presentation Foundation , işlevsel yaklaşımın GUI programlama için çok iyi çalıştığının bir kanıtıdır. Birçok işlevsel yönü vardır ve "iyi" WPF kodu (MVVM paternini araştırın) zorunlu olana göre fonksiyonel yaklaşımı vurgular. WPF'nin en başarılı gerçek dünya işlevsel GUI araç takımı olduğunu cesurca söyleyebilirim :-)

WPF, XAML'deki Kullanıcı arabirimini açıklar (işlevsel olarak C # veya F # 'ya da yeniden yazabilmenize rağmen), böylece yazacağınız bazı kullanıcı arabirimleri oluşturmak için:

<!-- Declarative user interface in WPF and XAML --> 
<Canvas Background="Black">
   <Ellipse x:Name="greenEllipse" Width="75" Height="75" 
      Canvas.Left="0" Canvas.Top="0" Fill="LightGreen" />
</Canvas>

Dahası, WPF ayrıca başka bir bildirim etiketi kümesi kullanarak olaylara animasyonları ve tepkileri bildirerek tanımlamanızı sağlar (yine aynı şey C # / F # kodu olarak yazılabilir):

<DoubleAnimation
   Storyboard.TargetName="greenEllipse" 
   Storyboard.TargetProperty="(Canvas.Left)"
   From="0.0" To="100.0" Duration="0:0:5" />

Aslında, WPF'nin Haskell'in FRP'si ile birçok ortak yanı olduğunu düşünüyorum (WPF tasarımcılarının FRP'yi bilmediğine inanıyorum ve biraz talihsiz - WPF, işlevselliği kullanıyorsanız bazen biraz garip ve belirsiz hissediyor. bakış açısı).


12
XAML, doğası gereği çok açıklayıcı olsa da, MVVM gerçekten işlevsel bir programlama tarzını teşvik ediyor mu? Görevi görünümün durumunu izlemek (ve INotifyPropertyChangedher şeyin adı verilen bir arayüzü uygulayan) bir görünüm modelinin tüm fikri, benim için FP'ye karşı karşıt görünüyor. Kesinlikle FP konusunda uzman değilim ve belki de bildirimsel yönün aksine değişmezlik yönüne çok fazla odaklanıyorum, ancak MVVM modelinin (tipik olarak kullanıldığı gibi) FP'nin bir örneği olduğunu görmekte sorun yaşıyorum.
devuxer

1
@devuxer olduğunu iddia ediyorum. Kimsenin sıkı değişmez kod için FP'yi gerçekçi bir şekilde kullanacağını sanmıyorum. Bunun yerine, değişebilirlik sınırlarınızın nerede olduğuna karar verirsiniz ve diğer tüm seviyelerde değişmez çalışırsınız - bu durumda, devleti fiilen mutasyona uğratan tek küçük parça dışında herkesin değişmez olduğunu varsayabilir. HTML'nin nasıl çalıştığına benzer - evet, değişmez DOM'unuz var, ancak her gezintiğinizde yeni bir tane oluşturmanız gerekiyor. INotifyPropertyChangedGUI güncellemelerini işlemeniz gereken her yere aktardığınız bir güncelleme işlevidir - bir gecikme düzeltmesidir.
Luaan

3
Steven Pemberton, F # ve WPF üzerine 2 harika mesaj yazdı , ikinci yazının sonuna doğru F # ile WPF gelişimi hakkındaki düşünceleri bu tartışmaya ekliyor. Beni de ilgilendiren 2 örnek, olay güdümlü MVVM'de fonksiyonel bir kontrolörün kullanılması ve Flying Frog Consultancy tarafından WPF kontrolleri demosunda basit bir arayüz oluşturmak için ayrımcı sendikalar ve özyineleme kullanılmasıydı .
Funk

29

Aslında fonksiyonel programlama (F #) kullanıcı arayüzü programlama için örneğin C # çok daha iyi bir araç olduğunu söyleyebilirim. Sadece sorunu biraz farklı düşünmelisin.

Bu konuyu Bölüm 16'daki işlevsel programlama kitabımda tartışıyorum , ancak (IMHO) 'yı F #' de kullanabileceğiniz en ilginç modeli gösteren ücretsiz bir alıntı var . Dikdörtgen çizimlerini uygulamak istediğinizi varsayalım (kullanıcı düğmeye basar, fareyi hareket ettirir ve düğmeyi serbest bırakır). F # 'da, şöyle bir şey yazabilirsiniz:

let rec drawingLoop(clr, from) = async { 
   // Wait for the first MouseMove occurrence 
   let! move = Async.AwaitObservable(form.MouseMove) 
   if (move.Button &&& MouseButtons.Left) = MouseButtons.Left then 
      // Refresh the window & continue looping 
      drawRectangle(clr, from, (move.X, move.Y)) 
      return! drawingLoop(clr, from) 
   else
      // Return the end position of rectangle 
      return (move.X, move.Y) } 

let waitingLoop() = async { 
   while true do
      // Wait until the user starts drawing next rectangle
      let! down = Async.AwaitObservable(form.MouseDown) 
      let downPos = (down.X, down.Y) 
      if (down.Button &&& MouseButtons.Left) = MouseButtons.Left then 
         // Wait for the end point of the rectangle
         let! upPos = drawingLoop(Color.IndianRed, downPos) 
         do printfn "Drawn rectangle (%A, %A)" downPos upPos }

Bu çok zorunlu bir yaklaşımdır (alışılmış pragmatik F # tarzında), ancak mevcut çizim durumunu depolamak ve inital konumu depolamak için değişebilir durumu kullanmaktan kaçınır. Yine de daha işlevsel hale getirilebilir, bunu yüksek lisans tezimin bir parçası olarak yapan ve birkaç gün içinde blogumda bulunması gereken bir kütüphane yazdım .

Fonksiyonel Reaktif Programlama daha işlevsel bir yaklaşımdır, ancak oldukça gelişmiş Haskell özelliklerine (oklar gibi) dayandığından biraz daha zor buluyorum. Bununla birlikte, çok sayıda durumda çok zariftir. Sınırlaması, bir durum makinesini (reaktif programlar için yararlı bir zihinsel model olan) kolayca kodlayamamanızdır. Bu, yukarıdaki F # tekniği kullanılarak çok kolaydır.


7
+1 Bu, birleştirici kitaplıkları ve F # kullanarak birkaç üretim GUI'si yazmış olan deneyimimizi yansıtır IObservable.
Jon Harrop

.NET kitaplığına reaktif uzantıların kullanılmasından bu yana FRP hakkındaki yorum değişti mi?
Fsharp Pete

1
İşte Arrowized FRP ve etkileri ve mutasyonun yasaları çiğnemeden Arrowized FRP içine nasıl yerleştirilebileceği üzerine bir araştırma: haskell.cs.yale.edu/wp-content/uploads/2015/10/… (btw çoğu FRP kütüphanesi Monad veya hatta Başvurular, bu yüzden Oklar gerekli değildir).
Erik Kaplun

17

F # veya OCaml gibi karma bir işlevsel / OO dilinde veya yan etkilerin IO monadına düştüğü Haskell gibi tamamen işlevsel bir dilde olun, çoğunlukla bir GUI'yi yönetmek için bir ton işin gerekli olduğu durumdur. tamamen işlevsel bir algoritmadan çok "yan etki" ye benzer.

Bununla birlikte, fonksiyonel GUI'lere gerçekten sağlam araştırmalar yapıldı . Fudgets veya FranTk gibi bazı (çoğunlukla) fonksiyonel araç takımları bile vardır .


6
"işlevsel GUI'ler" bağlantısı koptu :( önbellek: webcache.googleusercontent.com/search?q=cache:http://…
Dan Burton


12

Fonksiyonel Reaktif Programlamanın arkasındaki fikir açıcı fikirlerden biri, olaylara İKİ tepki veren bir olay işleme fonksiyonuna ve bir sonraki olay işleme fonksiyonuna sahip olmaktır. Böylece gelişen bir sistem, olay işleme işlevlerinin bir sırası olarak temsil edilir.

Benim için, Yampa'yı öğrenmek, o işlev üreten işlevleri düzgün bir şekilde elde etmek için çok önemli bir bakış oldu. Yampa hakkında güzel makaleler var. Ben Yampa Arcade tavsiye:

http://www.cs.nott.ac.uk/~nhn/Talks/HW2003-YampaArcade.pdf (slaytlar, PDF) http://www.cs.nott.ac.uk/~nhn/Publications/hw2003. pdf (tam makale, PDF)

Haskell.org'da Yampa'da bir wiki sayfası var

http://www.haskell.org/haskellwiki/Yampa

Orijinal Yampa ana sayfası:

http://www.haskell.org/yampa (maalesef şu anda kırılmış)


1
Bu bağlantı uzun bir süre koptu. Bu Yampa'yı
CoR

7

Bu soru ilk sorulduğu için, Elm tarafından fonksiyonel reaktif programlama biraz daha yaygın hale getirildi.

Tamamen işlevsel bir tarayıcı içi GUI'nin nasıl oluşturulacağına dair gerçekten mükemmel etkileşimli öğreticiler içeren http://elm-lang.org adresinden kontrol etmenizi öneririm .

Kendinize sağlamanız gereken kodun yalnızca saf işlevlerden oluştuğu tamamen işlevsel GUI'ler yapmanıza olanak tanır. Şahsen çeşitli Haskell GUI çerçevelerinden çok daha kolay buldum.



6

Elliot'un FRP ile ilgili konuşmasını burada bulabilirsiniz .

Ek olarak, gerçekten bir cevap değil, bir açıklama ve birkaç düşünce : bir şekilde "fonksiyonel GUI" terimi bir oksimoron (aynı terimdeki saflık ve IO) gibi görünüyor.

Ancak belirsiz anlayışım, fonksiyonel GUI programlamanın, (gerçek) zamana bağımlı kullanıcı girişini alan ve zamana bağlı GUI çıkışı üreten zamana bağlı bir fonksiyonu tanımlayıcı olarak tanımlamakla ilgilidir.

Başka bir deyişle, bu işlev, değişken durumu zorunlu olarak kullanan bir algoritma yerine, deklaratif olarak bir diferansiyel denklem gibi tanımlanır.

Geleneksel FP'de zaman bağımsız fonksiyonlar kullanılırken, FRP'de bir program tanımlamak için zamana bağlı fonksiyonlar yapı taşları olarak kullanılır.

Kullanıcının etkileşime girebileceği bir yay üzerinde bir topu simüle etmeyi düşünelim. Topun konumu grafiksel çıktıdır (ekranda), topu iten kullanıcı bir tuşa basar (giriş).

FRP'de bu simülasyon programını tanımlamak (anlayışım doğrultusunda) tek bir diferansiyel denklemle (deklaratif) yapılır: hızlanma * kütle = - yay gerilmesi * yay sabiti + Kullanıcı tarafından uygulanan kuvvet.

İşte ELM'de bu bakış açısını gösteren bir video .


5

2016 yılı itibariyle Haskell için Sodium ve Reflex (aynı zamanda Netwire) gibi nispeten daha olgunlaşmış FRP çerçeveleri vardır.

Manning Fonksiyonel Reaktif Programlama üzerinde kitap vitrinleri çalışan örnekler için Sodyum Java sürümü, ve karşılaştırmalı olarak bir FRP GUI kod tabanı davranacağını ve ölçekler Aktör temelli yaklaşımların yanı sıra imperative ve nasıl göstermektedir.

Ayrıca, Arrowized FRP ve yan etkiler, IO ve mutasyonun yasalara uyan, saf FRP ortamına dahil edilme olasılığı hakkında yeni bir makale var: http://haskell.cs.yale.edu/wp-content/uploads/2015/10/ dwc-yale-biçimlendirilmiş-tez.pdf .

Ayrıca belirtmek gerekir ki, ReactJS ve Angular ve diğerleri gibi JavaScript çerçeveleri zaten ölçeklenebilir ve oluşturulabilir GUI bileşenleri elde etmek için bir FRP veya başka bir şekilde işlevsel bir yaklaşım kullanmaktadır.


Sodyum Sodyum en github beni oku göre reaktif muz lehine önerilmemektedir olmuştur
mac10688

4

XUL gibi biçimlendirme dilleri, beyan edici bir şekilde bir GUI oluşturmanıza olanak tanır.


3

Bunu ele almak için F # kullanarak bazı düşüncelerimi yayınladım,

http://fadsworld.wordpress.com/2011/04/13/f-in-the-enterprise-i/ http://fadsworld.wordpress.com/2011/04/17/fin-the-enterprise-ii- 2 /

Ayrıca seri bitirmek ve F # UX programlama katkıda nasıl göstermek için bir video eğitimi yapmayı planlıyorum.

Burada sadece F # bağlamında konuşuyorum.

-Fahad


2

Tüm bu diğer cevaplar fonksiyonel programlama üzerine kuruludur, ancak kendi tasarım kararlarının çoğunu alırlar. Temelde tamamen işlevlerden ve basit soyut veri türlerinden yapılmış bir kütüphane gloss. İşte playişlevi için kaynak türü

-- | Play a game in a window. Like `simulate`, but you manage your own input events.
play    :: Display              -- ^ Display mode.
        -> Color                -- ^ Background color.
        -> Int                  -- ^ Number of simulation steps to take for each second of real time.
        -> world                -- ^ The initial world.
        -> (world -> Picture)   -- ^ A function to convert the world a picture.
        -> (Event -> world -> world)    
                -- ^ A function to handle input events.
        -> (Float -> world -> world)
                -- ^ A function to step the world one iteration.
                --   It is passed the period of time (in seconds) needing to be advanced.
        -> IO ()

Gördüğünüz gibi, tamamen diğer kütüphanelerin size yardımcı olduğu basit soyut türlerle saf işlevler sağlayarak çalışır.


1

Haskell'de yeni insanlar tarafından fark edilen en belirgin yenilik, dış dünya ile iletişim kurmakla ilgili saf olmayan dünya ile saf hesaplama ve algoritma dünyası arasında bir ayrım olması. Sıkça başlayan bir başlangıç ​​sorusu, "Nasıl dönüşebilirim IO, yani IO adönüşebilirim a?" Bunun yolu, IO ve zincir efektleri gerçekleştiren kod yazmak için monad'ları (veya diğer soyutlamaları) kullanmaktır. Bu kod dış dünyadan veri toplar, bir model oluşturur, muhtemelen saf kod kullanarak bazı hesaplamalar yapar ve sonucu çıkarır.

Yukarıdaki model söz konusu olduğunda, IOmonaddaki GUI'leri manipüle etmede korkunç bir şey görmüyorum . Bu stille ortaya çıkan en büyük sorun, modüllerin artık oluşturulamamasıdır, yani, programımdaki ifadelerin küresel yürütme sırası hakkındaki bilgimin çoğunu kaybediyorum. Onu kurtarmak için, eşzamanlı, zorunlu GUI kodunda olduğu gibi benzer bir muhakeme uygulamak zorundayım. Bu arada, saf olmayan GUI kodu için, yürütme sırası IOmonad'ın >==operatörünün tanımı nedeniyle açıktır (en azından sadece bir iş parçacığı olduğu sürece). Saf kod için, performansı artırmak veya sonuçta ortaya çıkan değerlendirmelerden kaçınmak için köşe durumlar hariç, hiç önemli değil .

Konsol ve grafik IO arasındaki en büyük felsefi fark, ilkini uygulayan programların genellikle senkron tarzda yazılmasıdır. Bu mümkündür (sinyalleri ve diğer açık dosya tanımlayıcılarını bir kenara bırakarak) yalnızca bir olay kaynağı vardır: yaygın olarak adlandırılan bayt akışı stdin. GUI'ler doğal olarak eşzamansızdır ve klavye olaylarına ve fare tıklamalarına tepki vermek zorundadır.

İşlevsel olmayan bir şekilde asenkron IO yapma felsefesine Fonksiyonel Reaktif Programlama (FRP) denir. ReactiveX gibi kütüphaneler ve Elm gibi çerçeveler sayesinde son zamanlarda saf olmayan, işlevsel olmayan dillerde çok fazla çekiş elde etti . Özetle, GUI öğelerini ve olay kaynakları olarak "gözlemlenebilir" adı verilen olay akışları gibi diğer şeyleri (dosyalar, saatler, alarmlar, klavye, fare gibi) görüntülemek gibidir. Bu olaylar gibi bilinen operatörleri ile birleştirilir map, foldl, zip, filter, concat, join, vb, yeni akışları elde edilir. Bu yararlıdır, çünkü programın kendisi scanl . map reactToEvents $ zipN <eventStreams>, program Ntarafından şimdiye kadar dikkate alınan gözlemlenebilirlerin sayısına eşit olan programdan görülebilir .

FRP gözlemlenebilirleriyle çalışmak, bir akıştaki olaylar zamanında sıralandığı için birleştirilebilirliğin kurtarılmasını mümkün kılar. Bunun nedeni, olay akışı soyutlamasının tüm gözlemlenebilirleri kara kutular olarak görüntülemeyi mümkün kılmasıdır. Sonuç olarak, olay akışlarını işleçleri kullanarak birleştirmek, yürütme sırasında bazı yerel siparişleri geri verir. Bu beni, Haskell'deki tüm işlevlerin referans olarak şeffaf olması gerektiği gibi, programımın gerçekte hangi değişmezlere dayandığı konusunda çok daha dürüst olmaya zorlar: Programımın başka bir bölümünden veri çekmek istiyorsam, açık olmalıyım reklam, işlevlerim için uygun bir tür bildiriyor. (Saf olmayan kod yazmak için Etki Alanına Özgü bir dil olan IO monad, bunu etkili bir şekilde atlar)


-22

Fonksiyonel programlama, üniversitedeyken devam etmiş olabilir, ancak hatırladığım gibi, fonksiyonel bir programlama sisteminin ana noktası programcının herhangi bir “yan etki” yaratmasını durdurmaktı. Bununla birlikte, kullanıcılar oluşturulan yan etkiler nedeniyle yazılım satın alırlar, örneğin bir kullanıcı arayüzünü güncelleme.


25
Bence amacı yanlış anladınız: fonksiyonel programlamanın dünya üzerinde hiçbir dış etkisi yoktur - bu tüm programları tamamen işe yaramaz hale getirir! Aksine, fonksiyonel programlama IO'yu karantinaya almanızı sağlar, böylece hangi bitlerin onu kullandığını ve hangi bitlerin kullanmadığını bilirsiniz.
Tikhon Jelvis

Whoooooooosh x20
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.