Geçtiğimiz yıl boyunca (Java geçmişinden gelen) Scala kodu yazıldım . Vals, vaka sınıfları, harita / filtre / lambda fonksiyonları, çıkarımlar ve tür çıkarımı ile nasıl daha basit ve daha temiz bir kod oluşturabileceğinizi gerçekten sevdim. Daha çok Akka tabanlı bir uygulama için kullandım.
Bu yıl, fonksiyonel programlamayı gerçekten seven yeni bir ekiple Scala projesinde çalışıyorum. Scalaz'ı yoğun bir şekilde kullanıyorlar ve kod her yerde uygulamalar, bağlam sınırları, okuyucu / yazar / eyalet monad ile dolduruluyor, hatta ana yöntem bir I / O monadına "sarılıyor". Onların mantığı, bu kodun doğru olduğunu ve her fonksiyonun yan etkiler içermediğini iddia ederek derleyicinin "bizim için çalışmasını" sağlamasıdır.
Yine de, benim bakış açımdan, tüm bu sözdizimi gerçekten iş mantığının önüne geçer. Örneğin, bir tür "MyBusinessObject" iyidir ve "List [MyBusinessObject]", "Option [MyBusinessObject]" veya "Future [MyBusinessObject]" gibi türler de iyidir. Hepsinin açık bir anlamı ve amacı var. Öte yandan, aşağıdaki gibi kodlayın:
def method[M[_]: Applicative] = {
case (a, b) => (ca[M](a) |@| cb[M](b)) {
case t @ (ra, rb) =>
if (ra.result && rb.result) t.right
else t.left
}
}
programa karmaşıklık katıyor mu, yoksa ben bu programlamaya alışkın değil miyim?
>>=
ve <$>
ortalama hangi bir şey sizin kadar ne yaptıklarını bilmek. Ne demek istediklerini öğrendikten sonra, şimdi bana çok doğal ve hızlı bir şekilde okuyorlar. Gerçekten bir cevap değil, sadece böyle şeylerle objektif deneyimim. Scala'yı da kullanıyorum, ancak Scalaz kütüphanesi ile ilgili hiçbir deneyimim yok.
for(i=0; i<7; ++i) { trivialOperation(i); }
bazı garip trivialOperationCount
değişkenlerle yazmazsınız, değil mi?) Şimdi, desen eşleşmesi ile fonksiyonel programlama dilleri bazen size daha fazla değişken getirecektir. O sadece erişimci yöntemi çağrıları OO yazmak. Sonuç genellikle daha özlüdür; belki biraz daha az açıklayıcıdır, ancak veri beyanına bakmak normalde bunu çabucak netleştirir. Statik yazım çok yardımcı olur, APL'deki gibi değildir.