Tüm Ruby'mi Haskellmiş gibi yazmaya karar verirsem sorun olmaz mı?


10

Ruby'nin yerleşik iyi liste operasyon yeteneklerine sahip olduğu göz önüne alındığında, azaltma, haritalama, seçme, toplama vb each. tüm Ruby eşyalarımı mümkün olan en saf şekilde mi yazacaksın? Özellikle G / Ç çok az olan veya hiç olmayan kod için (bu nedenle daha az belirgin yan etkiler)?

Haskell'i ('Hacker'ın dili olarak adlandırılır) öğreniyorum ve bir şeyler yapma şekline aşığım - Ruby'yi seviyorum, ama daha fazla Haskell ruhu aktığında daha da eğlenceli olabileceğini düşünüyorum ( 'Ruby ilk başta ödünç almıyor / ondan çok şey öğreniyor mu?)

Yapıcı rehberlik hoş geldiniz ...


13
Neden sadece Haskell'de yazmıyorsun?

1
Sadece Haskell'de yazardım, ama Ruby tamamen atılmayı hak edecek kadar kötü değil. Komut dosyası yazarken kullanabileceğimi ve AI öğelerini öğrenirken birlikte kesmek istediğim birçok hızlı denemeyi seviyorum. Ama muhtemelen ayrıca Haskell öğrenmeye yeni başladığım için, sonunda tavsiyelerde bulunabilir :-)
nemesisfixx

2
Stack Overflow'un neden izin istediğini anlamıyorum. Bir ekipteki diğer kullanıcılarla paylaşacağınız bir kod yazıyorsanız, yine de kodlama stillerinizi koordine etmeniz gerekir. Aksi takdirde, ne önemi var?
Mike Daniels

Neden SO soruyorum? çünkü deneyimli bilgisayar korsanlarının ve programcılarının dürüst görüşlerine saygı duyuyorum. Tecrübeli zihinlerin benimle (ve benim gibi diğerleri) paylaşabileceği saf fonksiyonel bir yaklaşım kullanmanın faydaları olabilir.
nemesisfixx

“Hayır” ın nesnel nedenleri olduğu düşünüldüğünde, bu meşru bir sorudur.
Andrew Grimm

Yanıtlar:


16

Bunu python ile yapıyorum. Bunun için tasarlanmamış bir dilde kalıtsal olarak saf bir işlevsel tarzda yazmanın hantal olduğunu düşünüyorum. Örneğin, in_order'ın iki tanımını karşılaştırın :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

in_orderHaskell yolunu python'a yazmak hem ayrıntılı (python gerekli deyimleri çok iyi desteklemediğinden) hem de yavaş olacaktır (Haskell'in tembellik nedeniyle sabit alanı yerine doğrusal boşluk).

Ancak, işlevsel organizasyon ve her fonksiyonun deyimsel uygulaması ile python programları oluşturmada başarılı oldum . Bunun programlamanın iyi bir yolu olduğu fikri aslında codecatalog projemin arkasındaki tez . Yani, bileşenlerim, devletli sınıflardan ziyade, üzerlerinde çalışan soyutlamalar ve işlevler (saf arayüz ile ) etrafında odaklanmış ve güzel bir şekilde bir araya geliyor. Aslında, bu şekilde organize edilen kodun yeniden kullanımı sınıflarla organize edilen koddan daha esnek gibi görünmektedir. Bununla birlikte, bu hala kişisel bir önyargı olabilir, çünkü ben hala bir Haskell adananıyım.

Bu yüzden sorunuzun cevabının biraz olduğunu söyleyebilirim . Düşünmenize yardımcı olması için fonksiyonel köklerinizi kullanın, ancak aşırıya kaçmayın. Örneğin. Ruby'de tembel listelerin simüle edilmesi sadece deyim uğruna muhtemelen değerinden daha fazla sorun olacaktır.


Bir şekilde tanımın beni pascal düşündürdü.
rasjani

@rasjani, oh? Neden?

Bilmiyorum, belki de iyi İngilizce anlama eksikliği ya da ne tarif tür (en az en az) şeyler nerede düzenlenmiş / pascal birimleri düzenlenmiş. Sadece bir tür zihinsel bağlantı, ilk seçenek nedeniyle gerçek bir bağlantınız olmayabilir;)
rasjani

1
"Haskell'in tembellikten kaynaklanan sabit uzay yerine doğrusal uzay" ifadesi doğru değildir. Tembellik hala doğrusal düzeni ima eder. Ne demek istediğini anlıyorum.

3
@aromero, ben seninkini anlamıyorum. Siparişin bununla ne ilgisi var? Haskell çöpünden, tükettikten sonra karşılaştırma listesinin başkanlarını toplayan sabit alan gelir and; tıpkı bir döngü gibi davranacaktır. Oysa python'un karşılaştırma listesi, andherhangi birinin analoğunu görmeden önce tam olarak oluşturulmalıdır (jeneratörleri kullanmadığınız sürece ... ki bu bir olasılıktır).

7

Ruby kodunu Haskell değil, Scheme gibi işlevsel bir tarzda yazabilirsiniz. Haskell gibi yazmak için, Haskell benzeri bir tip sistemine ve yaygın tembel değerlendirmeye ihtiyaç duyacaktır.


1

İşlevsel programlamayı anladım ve özellikle Haskell, Ruby'de karşılaştığım bazı durumlarda bana yardımcı oldu. Ama Haskell'i ne kadar çok öğrenirsem, Ruby'nin Haskell'e hiç benzememenin ne kadar uzak olduğunu anlarım.

Bir kere modül / kod yükleme durumu uçsuz bucaksız. Geçerli yorumlayıcıda kuyruk çağrısı optimizasyonu açık değil, bu nedenle özyinelemeyi Haskell'de yaptığınız gibi kullanamazsınız. Ve Monads'a girdikten sonra, Haskell ve Ruby'de elde edebileceğiniz soyutlama seviyeleri arasında gerçekten bir karşılaştırma yok.

Eğer ilgileniyorsanız, ben öğrendiğim gibi gist.github.com bazı Ruby / Haskell karşılaştırma kodu gönderiyorum .

Ruby'ye en iyi şekilde çalıştığım teknik, yapabileceğim saf işlevleri bulmaktı, bu sizin yapmaya çalıştığınız gibi geliyor.


Benim Smalltalk testlerinin birinde: self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). Monadları bilinçli olarak kullanamamanızın hiçbir nedeni yoktur , onları kullandığınızı bilmeden kullanmak yerine (listeler gibi).
Frank Shearar

0

Evet derim". Bahsettiğin (sanırım) yakut dilindeki fonksiyonel programlama etkisi. İşlevsel paradigmanın nesne yönelimli iltifat veya örtüşen bazı gerçekten güzel kavramları vardır (özellikle yan etkisi yoktur).

Ruby ile ilgili en güzel şey, lineer, objektif, yönlendirilmiş veya işlevsel bir tarzda kodlama yapmanıza veya bunların bir karışımına izin vermesidir. Ve basit, doğrusal komut dosyanız, karmaşıklığı arttığında ve olduğunda OO / fonksiyonel stile dönüşebilir.


0

Başkalarıyla işbirliği yapıp yapmayacağınıza bağlıdır. Kod üzerinde kendiniz çalışıyorsanız, en rahat hissettiğiniz stili kullanın. Ancak, diğer Ruby programcılarıyla çalışıyorsanız, bunlar tamamen işlevsel bir programlama stiline alışık olmayabilir ve bu nedenle kodunuzla karıştırılmayabilir. Daha sonra, ortak çalışanlarınız Ruby'ye taşınan Haskell programcılarıysa, bu sorunla karşılaşmayabilirsiniz.

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.