FP untuk simulasi dan pemodelan

12

Saya akan memulai proyek simulasi / pemodelan. Saya sudah tahu bahwa OOP digunakan untuk proyek semacam ini. Namun, mempelajari Haskell membuat saya mempertimbangkan untuk menggunakan paradigma FP untuk pemodelan sistem komponen. Biarkan saya uraikan:

Katakanlah saya memiliki komponen tipe A, dicirikan oleh seperangkat data (parameter seperti suhu atau tekanan, PDE dan beberapa kondisi batas, dll.) Dan komponen tipe B, ditandai oleh serangkaian data yang berbeda (berbeda atau parameter yang sama, kondisi PDE dan batas yang berbeda). Mari kita juga berasumsi bahwa fungsi / metode yang akan diterapkan pada setiap komponen adalah sama (misalnya metode Galerkin). Keadaan objek yang dapat berubah akan digunakan untuk parameter yang tidak konstan.

Jika saya menggunakan pendekatan OOP, saya akan membuat dua objek yang akan merangkum data masing-masing jenis, metode untuk memecahkan PDE (warisan akan digunakan di sini untuk menggunakan kembali kode) dan solusi untuk PDE.

Di sisi lain, jika saya menggunakan pendekatan FP, masing-masing komponen akan dipecah menjadi bagian data dan fungsi yang akan bertindak atas data untuk mendapatkan solusi untuk PDE. Parameter non-konstan akan dilewatkan sebagai fungsi dari sesuatu yang lain (waktu misalnya) atau diekspresikan oleh semacam mutabilitas (emulasi dari mutabilitas, dll.) Pendekatan ini tampaknya lebih mudah bagi saya dengan asumsi bahwa operasi linear pada data akan sepele.

Untuk menyimpulkan, apakah menerapkan pendekatan FP sebenarnya lebih sederhana dan lebih mudah untuk dikelola (menambahkan jenis komponen yang berbeda atau metode baru untuk menyelesaikan pde) dibandingkan dengan yang OOP?

Saya berasal dari latar belakang C ++ / Fortran, ditambah lagi saya bukan programmer profesional, jadi perbaiki saya pada apa pun yang saya salah.

heaptobesquare
sumber

Jawaban:

7

Pertanyaan bagus, saya sudah memikirkan hal yang sama. Secara historis, paradigma OO muncul dari perlunya simulasi komputer - lihat sejarah Simula - dan meskipun bahasa OO awal seperti Smalltalk dibuat oleh orang-orang yang tahu apa yang mereka lakukan (yaitu Alan Kay), OO sekarang bisa dibilang terlalu sering digunakan dan membawa terlalu banyak kerumitan yang tidak disengaja .

Secara umum, program gaya FP akan lebih pendek, lebih mudah untuk diuji, dan lebih mudah untuk dimodifikasi daripada program OO. Seperti yang dikatakan Rob Harrop dalam pidatonya, Is the Future Functional? , Anda tidak akan pernah bisa lebih sederhana daripada fungsi dan data; keduanya menyusun tanpa batas, untuk membangun abstraksi apa pun yang dibutuhkan. Jadi salah satu cara untuk menjawab pertanyaan Anda (atau saya hanya menyatakan kembali? :) adalah dengan bertanya, Apa fungsi level tertinggi, dan input-data level tertinggi -> output-data seperti apa? Kemudian Anda dapat mulai memecah fungsi-fungsi "alfa" dan tipe data ke dalam lapisan abstraksi berikutnya, dan ulangi seperlunya.

Perspektif lain (tidak cukup jawaban) pada pertanyaan Anda adalah melihat utas ini (penafian, saya memulainya) di StackOverflow, beberapa jawaban sangat menarik: /programming/3431654/how-does- fungsional-pemrograman-apply-to-simulasi

Pendapat saya sendiri pada titik ini adalah, kecuali Anda memodelkan situasi di mana benar-benar ada objek diskrit yang hanya berinteraksi dengan cara yang pasti (misalnya model jaringan komputer) - dan dengan demikian memetakan langsung ke kemampuan pesan yang bersih, passing-paradigm OO language - lebih mudah untuk menggunakan FP. Perhatikan bahwa bahkan dalam komunitas pemrograman game - di mana simulasi sangat lazim dan persyaratan kinerja sangat penting - pengembang yang berpengalaman menjauh dari paradigma OO dan / atau menggunakan lebih banyak FP, mis. Lihat diskusi HN ini atau komentar John Carmack tentang FP

limist
sumber
Senang mengetahui bahwa saya bukan satu-satunya yang meragukan OOP dalam simulasi dan terima kasih telah menjawab pertanyaan saya! Saya telah membaca komentar John Carmack tentang FP dan saya berpikir tentang mengimplementasikan beberapa aspek FP pada C ++ (menyalin objek, atau mengumpulkan input dan meneruskannya ke suatu fungsi) tetapi sekali lagi saya tidak tahu apakah saya harus memulai proyek saya dengan C ++ alih-alih bahasa FP, seperti Haskell, karena aspek FP sudah ada di dalamnya dan Anda hanya mengekspresikan kemampuan jika diperlukan. Apakah Anda terus menggunakan Clojure atau FP secara umum, mengingat Anda memiliki masalah / pertanyaan serupa?
heaptobesquare
@heaptobesquare - Ya, saya terus meningkatkan Clojure-fu saya dengan tujuan menulis simulasi di dalamnya. Belum ada yang siap untuk ditampilkan, tetapi saya tidak melihat show-stoppers, dan desain Clojure sangat pragmatis, misalnya Anda dapat menggunakan transien / mutasi jika diperlukan, ditambah agennya sangat cocok untuk aspek asinkron. Pada titik tertentu (tidak ada janji kapan) saya akan menulis artikel tentang topik ...
limist
Saya telah melihat Clojure tetapi saya tidak bisa mengatakan saya menyukai ekspresi S. Saya tahu ini praktis (kode Lisp adalah data) tetapi apakah mudah digunakan?
heaptobesquare
@heaptobesquare - s-expressions / Lisp syntax sebenarnya sangat mudah digunakan; pertama-tama pilih editor yang baik (Emacs atau vim, suara saya untuk Emacs, lihat dev.clojure.org/display/doc/Getting+Mulai+dengan+Emacs ) yang memiliki mode untuk Clojure, dapatkan buku yang bagus (mis. Pemrograman Clojure ), dan mulai meretas. Setelah paling banyak beberapa minggu, sintaks akan memudar ke latar belakang, sebagaimana mestinya - itu sangat konsisten Anda akan menganggapnya kurang sering secara eksponensial, dan membebaskan siklus mental untuk hal-hal yang lebih penting. :)
limist
Saya pasti akan mencobanya. Homoiconicity Lisp memang menarik.
heaptobesquare
2

IMHO untuk hampir setiap tugas dengan kompleksitas yang wajar, pertanyaan "adalah gaya FP atau gaya OOP pilihan yang lebih baik" tidak dapat dijawab secara objektif. Biasanya, dalam situasi seperti itu pertanyaannya bukan "FP atau OOP", tetapi bagaimana menggabungkan bagian terbaik dari kedua paradigma untuk menyelesaikan masalah Anda.

Masalah yang Anda buat di atas tampaknya merupakan masalah yang sangat matematis, dan saya membuat tebakan liar bahwa Anda akan memerlukan beberapa operasi matriks. OOP sangat baik untuk memodelkan tipe data abstrak, dan kalkulus matriks dapat dengan mudah diimplementasikan sebagai "objek matriks" dengan operasi pada matriks. Menerapkan ini dengan cara di mana semua operasi matriks adalah bagian dari kelas matriks membantu Anda untuk menjaga hal-hal bersama yang menjadi satu, sehingga mempertahankan struktur keseluruhan yang baik.

Di sisi lain, PDE adalah persamaan pada fungsi, dan solusinya mungkin berfungsi lagi. Jadi menggunakan pendekatan fungsional untuk tipe "komponen" itu mungkin terlihat alami di sini. Fungsi-fungsi itu mungkin memiliki parameter matriks, menunjukkan satu contoh bagaimana menggabungkan OOP dan FP. Contoh lain adalah implementasi kelas matriks, yang menggunakan alat fungsional untuk memetakan operasi tertentu untuk setiap elemen dari matriks Anda. Jadi di sini juga, itu bukan "OOP versus FP" tetapi "OOP dikombinasikan dengan FP" yang membawa Anda hasil terbaik.

Doc Brown
sumber
Terima kasih atas jawaban Anda! Jadi, jika saya harus menggunakan C ++, akan mengenkapsulasi hanya data (yaitu parameter, kondisi batas, dan PDE dalam bentuk matriks) dari komponen ke objek dan mendefinisikan fungsi (bahkan beberapa yang lebih tinggi, dalam kasus parameter adalah fungsi dari sesuatu yang lain), di luar cakupan objek, yang akan beroperasi pada data objek, menjadi efisien?
heaptobesquare
@heaptobesquare: jujur, saya tidak bisa memberi tahu Anda apakah itu akan efisien dalam kasus Anda . Cobalah, berpikir besar, mulai dari yang kecil. Mulai pemrograman beberapa "kode pelacak" ( artima.com/intv/tracer.html ) untuk mencari tahu mana yang paling berhasil dan yang tidak. Dan jika Anda sampai pada situasi di mana Anda melihat ada sesuatu yang tidak berfungsi dengan baik, refactor.
Doc Brown
Haskell memiliki perpustakaan Hmatrix, yang merupakan binding untuk perpustakaan BLAS / LAPACK, dan sintaks yang sangat bagus untuk itu, yang akan saya pilih daripada pendekatan OOP secara pribadi.
paul
@ paul: Terima kasih, saya pasti akan melihatnya! Apakah perpustakaan Haskell umumnya konsisten dan kaya konten? Para wiki mengatakan demikian tetapi apakah ini fakta?
heaptobesquare
@heaptobesquare: Satu-satunya perpustakaan Haskell yang pernah saya gunakan sejauh ini adalah Parsec (saya menggunakannya untuk menulis assembler), tetapi saya senang menggunakannya. Saya hanya melakukan eksplorasi GHCI dari Hmatrix dan Haskell OpenGL binding tetapi tampaknya cukup bagus. Hmatrix terlihat hampir sama ringkasnya dengan MATLAB (yang telah saya gunakan sedikit) - yang dibuat khusus untuk hal semacam itu. Dari pengalaman saya yang terbatas perpustakaan konsisten - ini karena Haskell dibangun di atas sejumlah kecil blok bangunan sederhana - dan mereka juga kaya karena Haskellers tidak suka melakukan hal-hal duniawi :)
paul