Apa yang akan menjadi proyek pemrograman fungsional pertama yang bagus? [Tutup]

19

Apa yang akan menjadi proyek pemrograman fungsional pertama yang bagus?

Saya ingin menyelesaikan proyek sarjana saya dan saya ingin menyelesaikannya dengan proyek pemrograman fungsional. Kami tidak mempelajarinya di sekolah tetapi kami didorong untuk mencoba mempelajari hal-hal baru sendiri, dan saya pikir belajar paradigma baru tidak hanya bahasa baru akan menjadi latihan yang bagus untuk saya, dan mungkin sesuatu yang menarik untuk dilihat oleh guru juga. .

Masalahnya adalah saya ingin memulai sedikit lebih awal pada proyek saya untuk memanfaatkan liburan musim panas dan mendapatkan pemahaman yang lebih baik tentang pemrograman fungsional, dan membiasakan diri dengan satu bahasa.

Apa yang Anda katakan akan menjadi proyek praktik yang baik yang sedikit menantang, tetapi juga memungkinkan saya mempelajari bahasa, paradigma, dll. Lalu apa yang menurut Anda akan menjadi proyek yang baik (yang lebih maju) untuk proyek sarjana saya?

Saran untuk bahasa terbaik untuk memulai ketika masuk ke pemrograman fungsional akan dihargai juga.

Meme
sumber
1
"Bahasa apa yang harus saya pilih" dan pertanyaan pemilihan proyek keduanya di luar topik di sini. Silakan lihat FAQ dan diskusi meta ini untuk rincian lebih lanjut.
Adam Lear

Jawaban:

10

Biasanya lebih mudah jika Anda menggunakan sesuatu yang relatif matematis atau logis - bahasa pemrograman fungsional umumnya cocok untuk aplikasi yang mewakili beberapa bentuk transformasi dari input yang diberikan ke output.

Beberapa ide, dalam urutan kesulitan:

  • Algoritma genetika - menulis program yang mengembangkan solusi untuk tugas tertentu di mana solusi diwakili dalam DSL sederhana. Saya sudah bersenang-senang sebelum membangun bot kecil yang berburu makanan dalam kotak 2D dan mengembangkan berbagai jenis strategi

  • Parsing combinators - membangun parser combinator library yang memungkinkan Anda membuat parser untuk bahasa arbitrer menggunakan fungsi orde tinggi.

  • Jika Anda benar-benar menginginkan tantangan, Anda dapat mencoba menulis permainan komputer ... perlu diketahui bahwa ini adalah tugas yang sulit karena permainan memiliki jumlah besar keadaan yang bisa berubah yang bisa rumit untuk dikelola dalam gaya pemrograman fungsional. Berharap untuk belajar lebih dari yang pernah Anda ingin tahu tentang monad dll .....

Saya akan merekomendasikan Clojure sebagai bahasa fungsional pragmatis. Saya telah menggunakannya selama sekitar 18 bulan sekarang dan saya sangat senang dengan pilihannya. Alasan utama adalah:

  • Concurrency - Clojure memiliki sistem STM yang luar biasa yang menurut saya menjadikannya bahasa terbaik di dunia saat ini untuk multi-core concurrency. Lihat video di: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey jika Anda ingin memahami mengapa ini sangat istimewa
  • Ini adalah Lisp - jadi karena filosofi "kode adalah data", ini fantastis untuk metaprogramming berbasis makro (program yang menulis program, algoritma genetika dll.)
  • Pemrograman fungsional pragmatis - gaya Clojure sangat fungsional (banyak penekanan pada fungsi tingkat tinggi, urutan malas dll) tetapi tidak sepenuhnya murni seperti Haskell. Ada banyak alat bagus untuk menangani efek mtable dan efek samping
  • Dynamic - Clojure adalah bahasa dinamis secara default. Saya menemukan ini dorongan besar untuk produktivitas. Namun, Anda dapat menambahkan petunjuk jenis statis nanti jika Anda menginginkan manfaat kinerja pengetikan statis.
  • Kompilasi penuh - kode Clojure selalu dipatuhi (bahkan jika Anda melakukan "eval") sehingga Anda mendapatkan kinerja yang lumayan - tentu saja lebih baik daripada kebanyakan bahasa dinamis yang saya gunakan.
  • Anda mendapatkan akses ke semua perpustakaan dan alat di ekosistem JVM secara gratis. Jadi tidak seperti bahasa akademik yang memiliki perpustakaan sangat terbatas, Anda dapat mengakses apa saja di jagat raya Jawa dengan cukup mudah

Anda dapat mencoba dasar-dasarnya dengan sangat mudah dengan:

mikera
sumber
Saya memilih jawaban Anda untuk pertanyaan itu karena menjawab semua pertanyaan saya. Terima kasih banyak telah meluangkan waktu.
Mim
Haskell juga memiliki STM; (
alternatif
@mikera: Untuk bekerja dengan JVM, sudahkah Anda mencoba ABCL? Saya mencobanya dan hanya membuat contoh kecil tetapi saya hampir tidak memiliki pengalaman dengannya. (Saya juga punya buku Clojure dalam daftar todo saya, tetapi ini adalah cerita lain, saya ingin tahu jika Anda memiliki pengalaman bekerja dengan ABCL dan Java).
Giorgio
@Giorgio: ABCL sepertinya ini adalah implementasi Common Lisp yang layak di JVM. OTOH Clojure memiliki kelebihan karena dirancang untuk JVM, menggabungkan lebih banyak inovasi "modern", dan memiliki lebih banyak momentum komunitas. Saya pikir itu benar-benar turun ke apakah Anda peduli tentang menjaga kompatibilitas Common Lisp mundur atau tidak.
mikera
9

Sebelum Anda mulai berpikir tentang proyek tertentu, mulailah dengan mempelajari dasar-dasar pemrograman fungsional sehingga Anda dapat memiliki ide yang baik tentang jenis-jenis proyek yang cocok.

Tempat terbaik untuk memulai mungkin adalah Struktur dan Interpretasi Program Komputer (SICP), yang didasarkan pada dialek Skema Lisp. Ini adalah teks CS klasik, dan teks lengkapnya tersedia online (tautan disediakan).

Jika Anda ingin menjadi mewah, dan menggunakan bahasa fungsional yang lebih modern yang menargetkan JVM, lihat Clojure. Bahkan ada versi SICP yang diadaptasi khusus untuk Clojure .

Dengan membaca teks SICP, Anda akan mendapatkan ide mengapa pemrograman fungsional sangat cocok untuk jenis tugas tertentu, dan latihan-latihan tersebut mungkin menginspirasi proyek yang lengkap. Jika Anda memilih untuk pergi ke rute Clojure, dan ingin memeriksa beberapa proyek yang ada, ada beberapa tautan bagus di sini .

Jason Lewis
sumber
Terima kasih telah menyediakan tautan untuk buku ini. Saya akan membacanya untuk mendapatkan pemahaman yang lebih baik.
Mim
Sudahkah Anda membaca SICP Anda hari ini?
MattyD
3

Analisis kuantitatif

Jika Anda menemukan keuangan agak menarik melakukan beberapa hal kuantil dengan pemrograman fungsional adalah pasangan yang baik karena sangat algoritmik. Saya berbicara teori portofolio dan hal-hal seperti rasio sharpe dan sortino dll. Buat aplikasi yang menganalisis pengembalian dana dan memberikan statistik, diagram, dll. Yang berbeda

Saya akan merekomendasikan F # hanya karena saya pikir ini adalah bahasa fungsional yang mudah untuk memulai, memiliki alat yang baik dan kerangka kerja yang baik untuk mendukungnya. Alternatif lain adalah cadel dan clojure tetapi mereka agak sulit untuk dipelajari.

Homde
sumber
Pada level tinggi, memang benar bahwa Anda dapat melakukan banyak hal secara fungsional. Orang-orang telah menggunakan bahasa fungsional untuk menggambarkan hadiah opsi eksotis, misalnya. Tetapi ketika Anda pergi ke hal-hal tingkat dasar, seperti menghitung PCA, menyelesaikan persamaan nonlinier, dll., Algoritma menjadi semakin berulang dan Anda lebih baik mengkodekannya dengan cara gaya lama.
quant_dev
1
Saya tidak akan mengatakan itu, dalam pengalaman saya analisis kuantitatif adalah tentang menjalankan algoritma lebih dari seri. Saya telah menerapkan hal-hal quant dalam C # dan itu sangat selaras dengan LINQ, setidaknya untuk jenis teori portofolio
Homde
Bagaimana dengan implementasi algoritma itu sendiri?
quant_dev
Saya melihat tidak ada masalah dalam kebanyakan kasus, bukan? Ambil perhitungan rasio sharpe, pertama Anda menghitung pengembalian tahunan dari seri pengembalian, kemudian Anda menggunakan nilai itu dengan tingkat bebas risiko dan volatilitas: (annualizedReturn - riskFreeRate) / volatilitas. Tidak ada bahasa fungsional yang tidak bisa ditangani
Homde
Bagaimana dengan kalibrasi model penetapan harga?
quant_dev
3

Untuk awal, Anda bisa mencoba menerapkan permainan blackjack kecil di F #. Ini adalah proyek pekerjaan rumah yang ditugaskan selama tutorial video singkat ini . Solusi juga disediakan di internet (dan di salah satu video).

knb
sumber
2

Anda bisa menulis juru bahasa untuk skema atau lisp dengan OCaml.

davidk01
sumber
Juga untuk mencatat ada buku haskell tentang ini tentang skema penulisan di haskell.
alternatif
2

Bahasa fungsional mana yang Anda pikirkan. Masing-masing memiliki karakteristik yang berbeda. Satu bahasa yang membuat dampak terbesar pada saya adalah Haskell dan saya sarankan Anda melakukan hal yang sama.


sumber
Saya berpikir tentang F # jujur ​​karena di Denmark semuanya Microsoft populer, tetapi semakin saya membaca pendapat yang berbeda, saya meragukan keputusan ini. Saya ingin bahasa yang akan membantu saya mempelajari paradigma terutama, dan setelah saya yakin itu tidak sulit untuk belajar yang lain jika saya perlu atau mau.
Mim
Sangat tergantung pada di mana Anda berada dan apa yang Anda lakukan. Bagi kami teknologi pemrograman Microsoft tidak berguna karena tidak mendukung platform utama kami. Tapi saya ngelantur: jika Anda ingin menggunakan F #, bagus, tapi kemudian buka pertanyaan spesifik F # baru.
Saya tidak ingin menggunakannya. Saya belum mengambil keputusan. Pertanyaan tentang bahasa yang digunakan adalah yang kedua.
Mim
Dalam hal itu, cari proyek dan kemudian minta rekomendasi bagaimana menyelesaikannya. Misalnya Prolog bagus untuk pencarian pohon keputusan. Haskell sangat bagus untuk pencocokan pola. Lisp sangat bagus untuk membangun dan memanipulasi program Lisp saat runtime tergantung pada data Anda.
0

Anda juga dapat berkontribusi pada beberapa proyek sumber terbuka.

Misalnya, dalam proyek bahasa pemrograman Frege , ada banyak pekerjaan yang harus dilakukan. Misalnya, Anda bisa peduli tentang porting pustaka Haskell dasar. Ini akan membuat Anda semacam pakar Haskell saat Anda mengerjakannya.

Ingo
sumber