Teman, kami terus memahami pemrograman fungsional. Pada bagian kedua dari seri artikel ini, Anda akan berkenalan dengan prinsip-prinsip dasar dari paradigma pengembangan ini dan memahami bagaimana pendekatan ini berbeda dari pemrograman berorientasi objek atau imperatif.

Nilai dan Fungsi
Sekali lagi, pertimbangkan fungsi sederhana ini.
let add1 x = x + 1
Apa yang dimaksud x
sini:
- Ambil beberapa nilai dari domain (cakupan).
- Gunakan nama "
x
" untuk memberikan nilai ini sehingga dapat diakses nanti.
Menggunakan nama untuk mewakili nilai disebut mengikat. Nama " x
" adalah "terikat" ke nilai input.
Jadi, jika Anda menghitung fungsi dengan nilai input, katakanlah, 5, hal berikut akan terjadi: di mana pun " x
" dalam definisi asli, nilai 5 diatur, mirip dengan fungsi "temukan dan ganti" dalam editor teks.
let add1 x = x + 1 add1 5 // «x» with «5» // add1 5 = 5 + 1 = 6 // 6
Penting untuk dipahami bahwa ini bukan tugas. " x
" bukan "slot" dan bukan variabel dengan nilai yang ditetapkan yang dapat diubah nanti. Ini adalah asosiasi satu kali dari nama " x
" dengan nilai tertentu. Nilai ini adalah salah satu bilangan bulat yang telah ditentukan, tidak dapat diubah. Yaitu sekali terikat x
tidak dapat diubah . Label yang pernah dikaitkan dengan nilai selamanya dikaitkan dengan nilai ini.
Prinsip ini adalah bagian penting dari pemikiran fungsional: tidak ada "variabel", hanya nilai .
Berfungsi sebagai Nilai
Jika Anda memikirkannya sedikit lebih lama, Anda dapat melihat bahwa nama " add1
" itu sendiri hanya mengikat "fungsi yang menambah input satu." Fungsi itu sendiri tidak tergantung dari nama yang dilampirkan.
Dengan memperkenalkan let add1 x = x + 1
, kita katakan ke kompiler F # "setiap kali Anda melihat nama" add1
", ganti dengan fungsi yang menambahkan 1 ke input." " add1
" disebut nilai fungsi .
Untuk melihat bahwa fungsi tidak tergantung pada namanya, cukup untuk menjalankan kode berikut:
let add1 x = x + 1 let plus1 = add1 add1 5 plus1 5
Seperti yang Anda lihat, “ add
” dan “ plus
” adalah dua nama yang dikaitkan dengan fungsi yang sama.
Anda selalu dapat mengidentifikasi fungsi nilai dengan tanda tangannya, yang memiliki domain -> range
bentuk standar domain -> range
. Tanda tangan umum dari fungsi nilai:
val functionName : domain -> range
Nilai sederhana
Bayangkan sebuah operasi yang tidak menghasilkan apa-apa dan selalu mengembalikan 5.

Ini akan menjadi operasi "konstan".
Bagaimana ini bisa dijelaskan dalam F #? Kami ingin memberi tahu kompiler: "setiap kali Anda melihat nama c
, ganti dengan 5". Seperti ini:
let c = 5
Saat menghitung akan kembali:
val c : int = 5
Kali ini tidak ada panah yang cocok, hanya satu int. Dari yang baru - tanda yang sama dengan nilai nyata yang dikurangi setelahnya. Kompiler F # tahu bahwa pengikatan ini memiliki nilai yang diketahui, yang akan selalu dikembalikan, yaitu angka 5.
Dengan kata lain, kami hanya mendefinisikan nilai konstanta, atau, dalam hal F #, sederhana.
Anda selalu dapat membedakan nilai sederhana dari fungsi nilai, karena semua nilai sederhana memiliki tanda tangan yang serupa:
val aName: type = constant // -
Nilai sederhana vs. nilai fungsi | Makna sederhana vs. fungsi nilai
Penting untuk dipahami bahwa dalam F #, tidak seperti bahasa lain seperti C #, ada sedikit perbedaan antara nilai sederhana dan fungsi nilai. Kedua jenis adalah nilai yang dapat dikaitkan dengan nama (menggunakan kata kunci let
), setelah itu mereka dapat diteruskan ke mana-mana. Bahkan, kita akan segera melihat bahwa gagasan bahwa fungsi adalah nilai-nilai yang dapat diteruskan sebagai input ke fungsi lain adalah salah satu aspek kunci dari pemikiran fungsional.
Perhatikan bahwa ada sedikit perbedaan antara nilai sederhana dan fungsi nilai. Fungsi selalu memiliki domain dan rentang, dan harus "diterapkan" ke argumen untuk mengembalikan hasilnya. Nilai sederhana tidak perlu dihitung setelah mengikat. Menggunakan contoh di atas, jika kita ingin mendefinisikan "fungsi konstan" yang mengembalikan 5, kita dapat menggunakan:
let c = fun()->5 // or let c() = 5
Tanda tangan dari fungsi tersebut terlihat seperti ini:
val c : unit -> int
Bukan seperti itu:
val c : int = 5
Informasi lebih lanjut tentang unit
, sintaks fungsi, dan fungsi anonim akan diberikan nanti.
“Nilai” vs. "Objek"
Dalam bahasa pemrograman fungsional, seperti F #, sebagian besar hal disebut "nilai." Dalam bahasa berorientasi objek, seperti C #, sebagian besar hal disebut "objek." Apa perbedaan antara "makna" dan "objek"?
Nilainya, seperti yang kita lihat di atas, adalah anggota domain. Domain bilangan bulat, domain string, domain fungsi yang memetakan integer ke string, dan sebagainya. Pada prinsipnya, nilainya tidak berubah (tidak bisa berubah). Dan maknanya tidak memiliki perilaku yang melekat padanya.
Objek dalam definisi kanonik adalah enkapsulasi struktur data dengan perilaku terkait (metode). Secara umum, objek harus memiliki keadaan (yaitu, bisa berubah), dan semua operasi yang mengubah keadaan internal harus disediakan oleh objek itu sendiri (melalui notasi "titik").
Dalam F #, bahkan nilai primitif memiliki sejumlah perilaku "objek". Misalnya, Anda bisa mendapatkan panjang string melalui titik:
«abc».Length
Tetapi secara umum, kita akan menghindari istilah "objek" untuk nilai standar di F #, menyimpannya untuk merujuk ke kelas penuh, atau nilai lain yang menyediakan metode.
Nilai penamaan
Konvensi penamaan standar yang digunakan untuk nilai dan nama fungsi pada dasarnya adalah alfanumerik + garis bawah. Tetapi ada beberapa tambahan:
- Anda dapat menambahkan tanda kutip di bagian mana pun dari nama itu, tidak termasuk karakter pertama.
A'b'c begin' //
- Kasing terakhir sering digunakan sebagai label untuk versi nilai yang "berbeda":
let f = x let f' = derivative f let f'' = derivative f'
atau untuk variabel dengan nama yang sama dengan kata kunci yang ada
let if' btf = if b then t else f
Anda juga dapat menggunakan backticks ganda untuk string apa pun untuk menjadikannya pengidentifikasi yang valid.
``this is a name`` ``123`` //
Kasus di mana Anda mungkin perlu menggunakan trik backtick ganda:
- Saat Anda perlu menggunakan pengenal yang cocok dengan kata kunci.
let ``begin`` = «begin»
- Saat Anda perlu menggunakan bahasa alami untuk aturan bisnis, tes unit, atau dokumentasi yang dapat dieksekusi gaya BBD seperti Mentimun.
let ``is first time customer?`` = true let ``add gift to order`` = () if ``is first time customer?`` then ``add gift to order`` // - let [<Test>] ``When input is 2 then expect square is 4``= // code here // BDD clause let [<Given>] ``I have (.*) N products in my cart`` (n:int) = // code here
Tidak seperti C #, konvensi penamaan F # mensyaratkan bahwa fungsi dan nilai dimulai dengan huruf kecil, bukan huruf besar ( PascalCase
, bukan PascalCase
), kecuali mereka dirancang untuk berinteraksi dengan bahasa .NET lainnya . Namun, jenis dan modul menggunakan huruf kapital (di awal).
Sumber Daya Tambahan
Ada banyak tutorial untuk F #, termasuk materi untuk mereka yang datang dengan pengalaman C # atau Java. Tautan berikut mungkin berguna saat Anda masuk lebih dalam ke F #:
Beberapa cara lain untuk mulai belajar F # juga dijelaskan.
Akhirnya, komunitas F # sangat ramah pemula. Ada obrolan yang sangat aktif di Slack, didukung oleh F # Software Foundation, dengan kamar pemula yang dapat Anda gabung dengan bebas . Kami sangat menyarankan Anda melakukan ini!
Jangan lupa untuk mengunjungi situs komunitas berbahasa Rusia F # ! Jika Anda memiliki pertanyaan tentang belajar bahasa, dengan senang hati kami akan membahasnya di ruang obrolan:
Tentang penulis terjemahan
Diterjemahkan oleh @kleidemos
Perubahan terjemahan dan editorial dilakukan oleh upaya komunitas pengembang F # berbahasa Rusia . Kami juga berterima kasih kepada @schvepsss dan @shwars karena telah menyiapkan artikel ini untuk dipublikasikan.