Argumen untuk Pemrograman Fungsional [ditutup]

10

Saya baru-baru ini belajar F # untuk bersenang-senang (saya seorang VB.NET/C# dev), dan saya benar-benar menyukai beberapa hal yang ditawarkan. Secara teoritis itu. Tapi saya mengalami kesulitan memikirkan skenario di mana saya akan memilih untuk kode di F # daripada di C #. Ada ide?

Sistem Down
sumber
2
F#tidak sepenuhnya mewakili pemrograman fungsional. Coba Clojuresaja.
Pekerjaan
1
Saya tidak tahu F #, tetapi saya menggunakan Haskell setiap kali saya ingin pikiran saya meledak. Bekerja setiap saat sejauh ini;)
1
infoq.com/presentations/Are-We-There-Yet-Rich-Hickey adalah video yang luar biasa tentang topik ini (OO vs. Fungsional)
mikera
Bahasa fungsional yang dinamis? Anda dapat memiliki sebanyak yang Anda inginkan. : P
Erik Reppen

Jawaban:

6

Saya mengalami kesulitan memikirkan skenario di mana saya akan memilih untuk kode dalam F # daripada di C #. Ada ide?

Dari sini :

Server asinkron

  • Alur kerja yang tidak sinkron untuk IO yang tidak sinkron.
  • Prosesor kotak surat untuk melewati pesan aman.
  • Jenis gabungan untuk status server dan katalog pesan.
  • Pencocokan pola dan rekursi ekor untuk alat berat negara.

Metaprogramming (misal penguraian)

  • Generator Parser seperti fslex dan fsyacc.
  • Combinator pengurai seperti FParsec.
  • Pola aktif untuk parser linting tangan yang elegan.
  • Tipe data aljabar untuk mewakili pohon parse.
  • Pencocokan pola untuk memanipulasi pohon, misalnya menerapkan tahapan optimisasi.
  • Refleksi untuk pembuatan kode cepat run-time.

Komputasi teknis

  • Fungsi tingkat tinggi untuk kode algoritmik yang elegan dan cepat.
  • Tipe data aljabar dan pencocokan pola untuk manipulasi simbolik.
  • Interoperabilitas untuk kekayaan perpustakaan .NET.
  • Interaktivitas menggunakan F # interaktif.
  • Ekspresi komputasi untuk memijat data.
  • Satuan ukuran untuk meningkatkan kebenaran.

Aplikasi GUI

  • Model sebagai pesan asinkron yang lewat antara kode antarmuka pengguna dan kode logika aplikasi.
  • Fungsi tingkat tinggi memungkinkan Anda mendefinisikan antarmuka pengguna secara deklaratif.

Pemrograman logika

  • Koleksi yang persisten agar mudah dilacak.
  • Buntut panggilan untuk keandalan.
  • Generalisasi otomatis untuk pemrograman generik yang mudah.

Pengujian

  • Jalankan tes unit secara interaktif.
  • BDD berarti menulis juru bahasa.
  • Bahasa scripting yang baik untuk menulis memanfaatkan harness dan memvisualisasikan hasil.

Performa

  • inline untuk abstraksi tingkat tinggi tanpa biaya.
  • Buntut panggilan untuk mesin negara cepat.
  • Struktur data murni fungsional untuk latensi rendah.
  • Metaprogramming untuk menghasilkan kode yang dioptimalkan.
Jon Harrop
sumber
Saya akan mengakui bahwa saya tidak tahu F # atau C # tetapi saya sarankan menghabiskan beberapa hari di F # dan melihat apa yang Anda pikirkan. Menurut saya menggunakan REPL adalah kemenangan besar dalam bahasa apa pun yang mendukungnya
Zachary K
5

Inilah yang menggunakan pemrograman gaya fungsional untuk - setiap hari lebih atau kurang.

Kami melakukan banyak hal statistik dan aktuaria dengan dataset yang cukup besar. Data yang diambil dari database adalah - objek yang pada dasarnya statis, tidak dapat diubah. Tidak ada alasan untuk membuat kelas dengan metode.

Setiap tahap perhitungan menambahkan beberapa detail tambahan, tetapi pada dasarnya tidak mengubah objek. Pada akhir pipa, kami benar-benar melakukan pengurangan untuk menghitung jumlah dan jumlah dan hal lainnya.

Bayangkan ini.

for data in summarize( enrich( calculate( some_query( criteria() ) ) ) ):
    print data

Setiap "fase" perhitungan adalah loop pemrograman fungsional yang tidak membaca-menghitung-hasil sederhana dan menciptakan objek komposit dari hal-hal lain ditambah hasil.

(Kami menggunakan Python, maka pemrograman fungsional menggunakan fungsi generator.)

Lebih mudah menggunakan stateless, objek yang tidak dapat diubah.

S.Lott
sumber
Apakah Python memiliki yang setara dengan F # ini? criteria() |> some_query |> calculate |> enrich |> summarizeSaya menemukan operator pipa maju dapat mengarah ke kode yang lebih jelas tetapi saya ngelantur.
ChaosPandion
@ChaosPandion: Pertama, sintaks itu membingungkan saya. Tetapi beberapa orang tampaknya menyukainya. Ada paket Python yang tak terhitung banyaknya. Saya yakin Anda dapat mencarinya di SO dan menemukan jawabannya.
S.Lott
@Chaos: Bukan yang saya tahu. biasanya saya menulis mapuntuk mendapatkan efek yang sama.
Paul Nathan
4

Secara teknis, ini bukan properti unik dari pemrograman fungsional, dan F # bukan bahasa fungsional murni. F #, sebagai salah satu keturunan ML, memberikan pencocokan pola yang sangat baik dan tipe data aljabar. Jadi, untuk tugas apa pun yang membutuhkan struktur data yang kompleks, F # jauh lebih ekspresif dan mudah digunakan daripada C #.

Bayangkan menerapkan kompiler di C # dan F # - mewakili pohon sintaksis abstrak dan mengubahnya lebih mudah jika bahasa Anda menyediakan ADT dan pencocokan pola.

Logika SK
sumber
2

Ideal untuk jenis pengurangan multi-sistem masif dan paralelisme multi-inti besar. Cukup keren, mengingat saat ini server entry level datang dengan 48 core (96 menghitung HT).

vartec
sumber
2

Jika Anda ingin berfungsi penuh, cobalah Haskell, Erlang juga memiliki beberapa hal yang sangat keren tentangnya.

Simon Payton-Jones mengatakan tentang Haskell, dia ingin memiliki program yang jelas tidak memiliki bug, daripada tidak memiliki bug yang jelas.

(Saya mungkin mendapat penawaran sedikit, tetapi Anda mendapatkan ide)

Dengan membatasi efek samping, Anda membuatnya lebih mudah untuk membuktikan bahwa kode Anda benar.

Zachary K
sumber
1

Satu keuntungan yang pasti adalah bahwa itu jauh lebih mudah diparalelkan.

biziclop
sumber
2
Anda berbicara tentang kemurnian dan satu kerugian yang jelas adalah kemurnian cenderung membuat program lebih lambat. Jadi paralel + murni belum tentu merupakan hal yang baik.
Jon Harrop