Apakah boleh jika saya memutuskan untuk menulis semua Ruby saya seolah-olah itu adalah Haskell?


10

Mengingat bahwa Ruby memiliki kemampuan operasi daftar yang baik di dalam - mengurangi, memetakan, memilih, mengumpulkan dll. Ia memiliki Procs, Blok dan Lambdas, dan memiliki dukungan iterasi yang bagus ( eachkeluarga), apakah itu akan menjadi keputusan desain yang buruk jika saya mencoba untuk tulis semua barang Ruby saya dengan cara yang paling murni fungsional? Terutama untuk kode yang memiliki sedikit atau tanpa I / O (dengan demikian efek sampingnya kurang jelas)?

Saya telah belajar Haskell (disebut bahasa Hacker 'nyata'), dan saya jatuh cinta dengan cara melakukan hal-hal - Saya suka Ruby, tetapi berpikir itu bisa lebih menyenangkan ketika lebih banyak roh Haskell mengalir ke dalamnya (well, didn Ruby meminjam / belajar banyak dari itu?)

Bimbingan konstruktif dipersilahkan ...


13
Mengapa tidak menulis di Haskell saja?

1
Saya akan menulis di Haskell saja, tetapi Ruby tidak seburuk yang layak dibuang sepenuhnya. Saya menyukai kenyataan bahwa saya dapat menggunakannya saat membuat skrip, dan untuk banyak eksperimen cepat saya suka meretas bersama ketika mempelajari hal-hal AI. Tetapi mungkin juga karena saya baru saja mulai belajar Haskell, mungkin mengikuti saran Anda akhirnya :-)
nemesisfixx

2
Saya tidak mengerti mengapa Anda meminta izin Stack Overflow. Jika Anda menulis kode yang akan Anda bagikan dengan orang lain di tim, Anda tetap harus mengoordinasikan gaya pengkodean Anda. Kalau tidak, apa bedanya?
Mike Daniels

Kenapa bertanya begitu? karena saya menghargai pendapat jujur ​​peretas dan pemrogram berpengalaman. Mungkin ada manfaatnya dalam menggunakan pendekatan fungsional murni untuk pemrograman yang pikiran yang berpengalaman mungkin dapat berbagi dengan saya (dan orang lain seperti saya).
nemesisfixx

Menimbang bahwa ada alasan obyektif untuk "tidak", ini adalah pertanyaan yang sah.
Andrew Grimm

Jawaban:


16

Saya telah melakukan ini dengan python. Saya merasa sulit untuk menulis dengan gaya fungsional murni herediter dalam bahasa yang tidak dirancang untuk itu. Misalnya, kontraskan dua definisi in_order :

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)

Menulis in_ordercara Haskell dengan python akan menjadi verbose (karena python tidak mendukung idiom yang diperlukan dengan sangat baik) dan lambat (ruang linear bukannya ruang konstan Haskell karena kemalasan).

Namun, saya telah berhasil membuat program python dengan organisasi fungsional , dan implementasi idiomatik dari setiap fungsi. Gagasan bahwa ini adalah cara yang baik untuk memprogram sebenarnya adalah tesis di balik proyek codecatalog saya . Jadi, komponen saya berorientasi pada abstraksi dan fungsi (dengan antarmuka murni ) yang beroperasi pada mereka, bukan kelas dengan negara, dan itu datang bersama dengan baik. Bahkan, kode yang diatur dengan cara ini tampaknya lebih fleksibel untuk digunakan kembali daripada kode yang diatur dengan kelas. Itu bisa menjadi bias pribadi, karena saya masih pemuja Haskell.

Jadi saya akan mengatakan jawaban atas pertanyaan Anda agak . Gunakan akar fungsional Anda untuk membantu Anda berpikir, tetapi jangan berlebihan. Misalnya. mensimulasikan daftar malas di Ruby hanya demi idiom mungkin akan lebih merepotkan daripada nilainya.


Entah bagaimana deskripsi Anda membuat saya berpikir tentang pascal.
rasjani

@rasjani, oh? Ada alasan mengapa

Saya tidak tahu, mungkin kurang memahami bahasa Inggris dengan baik atau apa yang Anda gambarkan cocok dengan bagaimana (saya setidaknya) hal-hal di mana diatur / struktur dalam unit pascal. Hanya semacam koneksi mental, mungkin tidak memiliki koneksi nyata karena opsi pertama;)
rasjani

1
Pernyataan "ruang linear bukannya ruang konstan Haskell karena kemalasan" tidak akurat. Kemalasan masih menyiratkan tatanan linier. Saya mengerti maksud Anda.

3
@aromero, saya tidak mengerti milikmu. Apa hubungannya pesanan dengan itu? Ruang konstan berasal dari sampah Haskell yang mengumpulkan kepala daftar perbandingan setelah andmengkonsumsinya; itu akan berperilaku seperti lingkaran. Sedangkan daftar perbandingan python harus dibuat secara penuh sebelum analog andakan melihat salah satunya (kecuali jika Anda menggunakan generator ... yang saya duga kemungkinan).

7

Anda dapat menulis kode Ruby dengan gaya fungsional seolah-olah itu Skema, bukan Haskell. Untuk menulisnya seolah-olah itu adalah Haskell, itu akan membutuhkan sistem tipe seperti Haskell, ditambah evaluasi malas yang meresap.


1

Saya telah menemukan pemahaman pemrograman fungsional, dan Haskell khususnya, untuk membantu saya dalam situasi tertentu yang saya temui di Ruby. Tetapi semakin saya mempelajari Haskell, semakin saya menyadari seberapa jauh Ruby dari bisa menjadi seperti Haskell sama sekali.

Situasi pemuatan modul / kode sangat buruk, untuk satu hal. Penerjemah saat ini tidak mengaktifkan pengoptimalan panggilan ekor, jadi Anda tidak dapat menggunakan rekursi seperti yang Anda lakukan di Haskell. Dan begitu Anda masuk ke Monads, benar-benar tidak ada perbandingan tingkat abstraksi yang dapat Anda capai di Haskell vs Ruby.

Jika Anda tertarik, saya telah memposting beberapa kode perbandingan Ruby / Haskell di gist.github.com seperti yang telah saya pelajari.

Teknik yang saya bawa ke Ruby yang paling berhasil adalah menemukan fungsi murni di mana saya bisa, yang sepertinya Anda coba lakukan.


Dalam salah satu tes Smalltalk saya: self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). Tidak ada alasan sama sekali mengapa Anda tidak dapat menggunakan monad secara sadar , sebagai lawan menggunakannya tanpa tahu Anda menggunakannya (seperti daftar).
Frank Shearar

0

Saya akan mengatakan "ya". Apa (saya pikir) yang Anda bicarakan adalah pengaruh pemrograman fungsional dalam bahasa ruby. Paradigma fungsional memiliki beberapa konsep yang sangat bagus yang memuji atau tumpang tindih dengan berorientasi objek (tidak ada efek samping, khususnya).

Hal terbaik dari ruby ​​adalah memungkinkan Anda untuk membuat kode dalam gaya linier, berorientasi objek atau fungsional, atau beberapa campuran dari ini. Dan skrip linier sederhana Anda dapat berubah menjadi OO / gaya fungsional jika dan ketika kompleksitasnya meningkat.


0

Itu tergantung pada apakah Anda akan berkolaborasi dengan orang lain. Jika Anda mengerjakan sendiri kodenya, gunakan gaya apa pun yang Anda rasa paling nyaman. Namun, jika Anda bekerja dengan programmer Ruby lainnya, mereka tidak boleh digunakan dengan gaya pemrograman yang murni fungsional dan karenanya dikacaukan oleh kode Anda. Kemudian lagi, jika kolaborator Anda juga merupakan programmer Haskell yang bermigrasi ke Ruby, Anda mungkin tidak memiliki masalah ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.