Apa sajakah praktik yang baik ketika mencoba mengajarkan pemrograman deklaratif kepada pemrogram imperatif?

13

Saya menawarkan untuk melakukan sedikit pelatihan di F # di perusahaan saya dan mereka tampaknya menunjukkan minat. Mereka umumnya programmer VB6 dan C # yang tidak mengikuti pemrograman dengan terlalu banyak semangat. Yang sedang berkata saya merasa lebih mudah untuk menulis kode yang benar ketika Anda berpikir dalam masalah fungsional sehingga mereka pasti harus mendapatkan beberapa manfaat darinya.

Adakah yang bisa menawarkan beberapa saran tentang bagaimana saya harus mendekati ini?

Ide ide

  • Jangan fokus pada sintaksis, melainkan fokus pada bagaimana bahasa ini dan idiom yang dipromosikannya dapat digunakan.
  • Coba dan pikirkan contoh-contoh yang merepotkan untuk ditulis dengan gaya imperatif tetapi diterjemahkan menjadi kode yang elegan ketika ditulis dengan cara deklaratif.
Kekacauan Kekacauan
sumber
F # dan pemrograman deklaratif ?????
P Shved
@ Pavel - Apakah itu pertanyaan?
ChaosPandion
3
@Pavel - OK, ingin menjelaskan mengapa Anda membuat pernyataan itu? Ini adalah kedua kalinya Anda membuat komentar yang sangat kabur. Ini sangat kasar.
ChaosPandion
3
en.wikipedia.org/wiki/Declarative_programming Pemrograman fungsional adalah jenis pemrograman deklaratif. +1 juga, pertanyaan yang bagus.
Catatan untuk diri sendiri - pikirkan nama
2
@Chaos, menurut pendapat saya, F # tidak mendukung paradigma pemrograman deklaratif. Evaluasi yang bersemangat dan fitur-fitur penting membuat bahasa hanyalah bentuk yang nyaman, seperti fungsional untuk menunjukkan pernyataan imperatif yang sama yang Anda gunakan dalam, katakanlah, C #. Ayo, bahkan makelebih merupakan bahasa deklaratif daripada F # atau Caml! (Ironisnya, ini membuat pekerjaan Anda lebih mudah.)
P Shved

Jawaban:

5

Pemrograman fungsional adalah binatang aneh bagi saya. Saya belajar F # dan Haskell, menulis beberapa program sederhana dan suka menggunakannya, tetapi tidak pernah memiliki "kilasan wahyu" yang dibicarakan beberapa orang. Tapi perlahan-lahan, saya perhatikan bahwa semakin banyak saya menulis kode yang dimaksudkan untuk tidak berubah, memecah tugas menjadi lebih banyak, fungsi yang lebih kecil, dan mencoba menggunakan delegasi lebih banyak lagi. Ini adalah hal yang, jika Anda suka, merayap ke dalam pekerjaan Anda karena nilai dari teknik-teknik itu jelas.

Sekarang, lebih praktis untuk pelatihan: Saya menemukan bahwa dua konsep benar-benar mengklik Pemrograman Fungsional sebagai gaya bagi saya.

Pertama, gaya KB didasarkan pada struktur data, bukan komposisi seperti dalam OOP. Saya melihat sesuatu seperti Daftar di C # sebagai trik pintar untuk menghasilkan daftar tipe-aman, sesuatu yang menyusun tipe (string) ke dalam tipe lain (daftar). Setelah mempelajari FP, saya melihat generik lebih mirip Monads sekarang. Daftar adalah bentuk terstruktur yang dapat diambil kode, dan menghiasi string.

Kedua, dan mungkin lebih bermanfaat bagi pemrogram C # / ASP, adalah gagasan bahwa FP bekerja pada rekursi dan pengulangan, sementara OOP bekerja pada mutabilitas dan perulangan. Saya cenderung menganggap siklus halaman ASP sebagai semacam FP sekarang: setiap permintaan diproses dari awal sampai seluruh siklus hidup, sehingga seluruh halaman, pada dasarnya, adalah satu program berulang yang besar dan lambat. Jika Anda dapat mempersempit gagasan itu, Anda mendapatkan ide yang lebih baik tentang bagaimana program imperatif dapat disusun di sekitar loop fungsi yang mengambil data, beroperasi di atasnya, dan mengembalikan data baru alih-alih memodifikasi yang lama.

Rintangan paling sulit, setidaknya bagi saya, untuk diatasi dengan pendekatan ini adalah perasaan tenggelam bahwa Anda membuang banyak sumber daya saat menggunakan objek yang bisa berubah akan menghemat banyak memori. Di GC kami percaya, dan saya hanya harus belajar untuk melepaskan masalah kinerja sampai saya benar-benar melihat program berjalan dan memverifikasi jika ada, dan jika demikian menggunakan profiler untuk melihat dengan tepat di mana masalahnya.

CodexArcanum
sumber
1

Banyak bahasa pemrograman imperatif (Ada, C / C ++, Turbo Pascal, FoxPro) memiliki kemampuan untuk mendefinisikan pointer ke fungsi atau nama prosedur literal yang dapat dievaluasi (dan prosedur dinamai setelah literal dipanggil) pada saat run time.

Contoh tradisional adalah qsort dalam C. Bangun di atas gagasan bahwa Anda dapat mendefinisikan algoritma yang mengeksekusi algoritma lain pada struktur data. Jelas ini hanya sebagian kecil dari apa pemrograman fungsional itu. Tetapi saya telah menemukan bahwa ini adalah titik awal yang baik untuk mendapatkan ide untuk meresap.

Setelah itu meresap, maka Anda dapat mulai mempelajari hal-hal lain (kekekalan, berbagi apa-apa, dll.)

luis.espinal
sumber
Koreksi: Apa yang ingin saya katakan adalah membangun gagasan bahwa Anda dapat mendefinisikan algoritma parametrized yang dapat menggunakan algoritma OTHER sebagai parameter dan menjalankannya pada struktur data.
luis.espinal
1

Adakah yang bisa menawarkan beberapa saran tentang bagaimana saya harus mendekati ini?

Tentu:

  • Pilih contoh Anda dengan hati-hati sehingga kode F # Anda tidak hanya menyelesaikan masalah dengan elegan tetapi juga jauh lebih elegan dari yang mungkin terjadi dengan C # / VB . Pencocokan pola dan jenis inferensi adalah teman Anda di sini.

  • Gunakan satu contoh untuk menyoroti manfaat fitur baru yang ditemukan di F #, misalnya alur kerja asinkron, pola aktif.

  • Jangan takut untuk memberikan contoh yang tidak murni menggunakan struktur data yang bisa berubah saat yang tepat. F # tidak murni karena suatu alasan.

  • Jangan berikan F # sebagai obat mujarab. Jelaskan aplikasi yang F # tidak cocok dan juga yang lebih cocok daripada bahasa .NET lainnya.

  • Tunjuk sampel mainan yang dapat mereka pelajari serta proyek dunia nyata yang berhasil yang menggunakan F # (Bing AdCenter, Halo 3 dll.).

  • Jelaskan semuanya dalam hal bagaimana F # dapat membantu mereka untuk memecahkan masalah dengan lebih mudah. Hindari perdebatan agama. Tetap positif tentang F #, bukan negatif tentang bahasa lain. Persenjatai mereka dengan fakta dan bukti tetapi biarkan mereka menarik kesimpulan sendiri.

Jon Harrop
sumber