Saya suka berpikir tentang Arrows, seperti Monads dan Functors, sebagai memungkinkan programmer untuk melakukan komposisi fungsi yang eksotis.
Tanpa Monads atau Arrows (dan Functors), komposisi fungsi dalam bahasa fungsional terbatas untuk menerapkan satu fungsi ke hasil fungsi lainnya. Dengan monad dan functors, Anda dapat menetapkan dua fungsi, dan kemudian menulis kode reusable terpisah yang menentukan bagaimana fungsi-fungsi tersebut, dalam konteks monad tertentu, berinteraksi satu sama lain dan dengan data yang diteruskan ke dalamnya. Kode ini ditempatkan di dalam kode ikat Monad. Jadi monad adalah satu tampilan, hanya wadah untuk kode ikat yang dapat digunakan kembali. Fungsi menyusun secara berbeda dalam konteks satu monad dari monad lain.
Contoh sederhana adalah Mungkin monad, di mana ada kode dalam fungsi bind sedemikian rupa sehingga jika fungsi A disusun dengan fungsi B dalam monad Mungkin, dan B menghasilkan Nothing, maka kode bind akan memastikan bahwa komposisi dua fungsi menghasilkan A Nothing, tanpa repot-repot menerapkan A ke nilai Nothing yang keluar dari B. Jika tidak ada monad, programmer harus menulis kode ke A untuk menguji input Nothing.
Monads juga berarti bahwa pemrogram tidak perlu mengetik secara eksplisit parameter yang diperlukan setiap fungsi ke dalam kode sumber - fungsi bind menangani parameter yang lewat. Jadi menggunakan monad, kode sumber dapat mulai terlihat lebih seperti rantai statis nama fungsi, daripada tampak seolah-olah fungsi A "memanggil" fungsi B dengan parameter C dan D - kode mulai terasa lebih seperti rangkaian elektronik daripada memindahkan mesin - lebih fungsional daripada keharusan.
Panah juga menghubungkan fungsi bersama dengan fungsi bind, menyediakan fungsionalitas yang dapat digunakan kembali dan menyembunyikan parameter. Tetapi Arrows sendiri dapat dihubungkan bersama-sama dan disusun, dan secara opsional dapat merutekan data ke Arrows lain pada saat runtime. Sekarang Anda dapat menerapkan data ke dua jalur Arrows, yang "melakukan hal yang berbeda" ke data, dan menyusun kembali hasilnya. Atau Anda dapat memilih cabang Arrows mana untuk meneruskan data, tergantung pada beberapa nilai dalam data. Kode yang dihasilkan bahkan lebih mirip sirkuit elektronik, dengan sakelar, penundaan, integrasi dll. Program ini terlihat sangat statis, dan Anda seharusnya tidak dapat melihat banyak manipulasi data yang terjadi. Ada lebih sedikit dan lebih sedikit parameter untuk dipikirkan, dan lebih sedikit yang perlu dipikirkan tentang nilai yang mungkin atau tidak mungkin diambil parameter.
Menulis program Arrowized sebagian besar melibatkan memilih dari rak Panah seperti splitter, switch, delay dan integrator, mengangkat fungsi ke dalam Arrows, dan menghubungkan Arrows bersama-sama untuk membentuk Arrows yang lebih besar. Dalam Pemrograman Fungsional Reaktif Arrowized, Arrows membentuk loop, dengan input dari dunia yang dikombinasikan dengan output dari iterasi terakhir dari program, sehingga output bereaksi terhadap input dunia nyata.
Salah satu nilai dunia nyata adalah waktu. Di Yampa, Signal Function Arrow secara tak terlihat memasukkan parameter waktu melalui program komputer - Anda tidak pernah mengakses nilai waktu, tetapi jika Anda menghubungkan panah integrator ke dalam program, ia akan menampilkan nilai yang terintegrasi dari waktu ke waktu yang kemudian dapat Anda gunakan untuk meneruskan ke panah lainnya.