Saya sedang membangun simulator yang mem-parsing beberapa peristiwa dari STDIN
dan "menjalankan" mereka. Latar belakang saya sebagian besar pemrograman fungsional hari ini, jadi sepertinya wajar untuk melakukan sesuatu seperti ini:
data Event = Thing1 String Int | Thing2 Int | Thing3 String String Int
Parse :: String -> [Event]
Simulate :: [Event] -> [Result]
di mana akan mensimulasikan
case event
of Thing1 a b => compute for thing one
| Thing2 a => compute for thing two
dll. Apa cara idiomatis untuk melakukan hal semacam ini di Jawa? Googling telah menunjuk saya ke arah kelas bersarang dan pola pengunjung, tetapi itu tampaknya agak berat dalam upaya saya. Penghapusan tipe sepertinya melawan saya, sulit. Bisakah Anda menunjukkan kepada saya garis besar tentang apa yang akan dilakukan dengan benar?
java
design
visitor-pattern
pattern-matching
closeparen
sumber
sumber
Event
tipe secara konseptual sama dengan memiliki satuInt
dan duaMaybe Strings
?Jawaban:
Penulis 'Pemrograman Fungsional di Scala' memberikan ilustrasi yang bagus tentang yang terbaik yang dapat dicapai di Jawa dengan cara yang aman:
http://blog.higher-order.com/blog/2009/08/21/structural-pattern-matching-in-java/
Pada dasarnya, ini menggunakan pengkodean Gereja dari kasus-kasus untuk memastikan bahwa kompiler akan mengeluh jika ada yang hilang.
Rincian tidak mudah diringkas dan memang begitu baik dibahas dalam artikel tersebut bahwa tidak ada gunanya mereproduksi mereka di sini (yang ini hyperlink apa untuk benar?).
sumber
t.match
dengan tiga metode daripada melewati tiga fungsi. (artikel yang ditautkan membingungkan Pola pengunjung dengan pengiriman ganda - pengunjung adalah pola untuk mengabstraksi iterasi melalui jaringan, bukan untuk memilih pola)public static int depth(Tree t)
mana dia menggunakan rantai jika sebuah instance ketika cara 'benar' untuk melakukan ini di Jawa adalah dengan mendefinisikan antarmuka dengan metode:public int depth()
dan gunakan polimorfisme. Sepertinya manusia jerami.Sebenarnya tidak ada hal seperti itu, mengingat bahwa Java (bahasa) pada dasarnya penting.
Jika Anda dapat menjalankan JVM, tetapi tidak terbatas pada bahasa Java , Anda bisa menyelidiki Scala, yang akan mencapai sesuatu seperti di atas menggunakan pencocokan pola .
Kalau tidak, saya pikir Anda tidak cocok dengan berbagai kasus dan metode panggilan secara manual, atau mungkin mendefinisikan subtipe 'Peristiwa' dan menggunakan polimorfisme untuk memanggil metode tertentu untuk setiap subtipe.
sumber
Lihatlah https://github.com/johnlcox/motif yang merupakan pustaka "pencocokan pola" seperti Scala untuk Java 8.
Tidak sebagus ML / Erlang / Haskell, tetapi masih terlihat jauh lebih deklaratif daripada kebanyakan.
sumber
Anda bisa menggunakan enum dan antarmuka, mengganti metode simulasi, seperti ini:
Katakanlah Anda punya
Event event
. Kemudian Anda dapat menggunakannya dalam salah satu dari dua cara:atau
Tetapi konstruktor dipanggil secara otomatis oleh JVM, jadi untuk juga menyimpan parameter di sana Anda harus menambahkan properti dengan accessors dll.
Atau, Anda bisa membuat kode acara Anda sebagai string konstan dan menggunakan
switch
konstruksi, dalam hal ini Anda akan melakukannyadll. Tapi ya, tidak ada yang asli yang langsung meniru pencocokan pola :(
sumber
Pola pengunjung atau ekuivalen penyandian gerejanya adalah cara yang harus ditempuh. Ini agak bertele-tele di Jawa, tapi semoga alat seperti Derive4J (prosesor anotasi yang saya pertahankan) atau Adt4J dapat menghasilkan boilerplate. Dengan menggunakan alat seperti itu, contoh Anda menjadi:
Derive4J menghasilkan kelas Acara yang menyediakan sintaks pencocokan pola yang fasih (dengan pemeriksaan lengkap bahwa semua kasus ditangani).
sumber