Rumah > Artikel > hujung hadapan web > Pengaturcaraan Fungsional dalam TypeScript
Anda boleh mencari kod sumber di sini: https://github.com/aelassas/functional-ts
Dalam TypeScript, fungsi hanyalah objek. Oleh itu, fungsi boleh dibina, diluluskan sebagai parameter, dikembalikan daripada fungsi atau diberikan kepada pembolehubah. Oleh itu, TypeScript mempunyai fungsi kelas pertama. Lebih tepat lagi, TypeScript menyokong perkara berikut:
Artikel ini tidak akan membincangkan asas pengaturcaraan berfungsi, kerana anda boleh menemui banyak sumber mengenai topik ini di Internet. Sebaliknya, ia akan bercakap tentang pengaturcaraan berfungsi dalam TypeScript yang digunakan untuk algebra, nombor, satah Euclidean dan fraktal. Contoh yang disediakan dalam artikel ini akan bermula daripada yang mudah kepada yang lebih kompleks tetapi sentiasa digambarkan dengan cara yang ringkas, mudah dan mudah difahami.
Untuk menjalankan kod sumber, anda perlu memasang Node.js. Setelah Node.js dipasang, muat turun arkib kod sumber, nyahzipnya, pergi ke folder kod sumber yang anda nyahzip pada terminal, sediakan persekitaran TypeScript dan pasang semua kebergantungan yang diperlukan dengan arahan berikut:
npm install
Untuk menjalankan demo nombor, jalankan arahan berikut:
npm run numbers
Untuk menjalankan demo pesawat Euclidean, jalankan arahan berikut:
npm run plane
Untuk menjalankan demo fraktal, jalankan arahan berikut:
npm run fractals
Biar S ialah mana-mana set unsur a, b, c ... (contohnya, buku di atas meja atau titik satah Euclidean) dan biarkan S' ialah mana-mana subset unsur ini (contohnya, buku hijau di atas meja atau titik dalam bulatan jejari 1 berpusat pada asal satah Euclidean).
Fungsi Ciri S'(x) bagi set S' ialah fungsi yang mengaitkan sama ada benar atau salah dengan setiap elemen x S.
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Biar S menjadi set buku di atas meja dan biarkan S' menjadi set buku hijau di atas meja. Biarkan a dan b dua buah buku hijau, dan biarkan c dan d dua buah buku merah di atas meja. Kemudian:
npm install
Biar S ialah set titik dalam satah Euclidean dan biarkan S' ialah set titik dalam bulatan jejari 1 berpusat pada asal satah Euclidean (0, 0) (bulatan unit). Biarkan a dan b ialah dua titik dalam bulatan unit, dan biarkan c dan d ialah dua titik dalam bulatan berjejari 2 berpusat pada asalan satah Euclidean. Kemudian:
npm run numbers
Oleh itu, mana-mana set S' sentiasa boleh diwakili oleh Fungsi Cirinya. Fungsi yang mengambil sebagai hujah elemen dan mengembalikan benar jika elemen ini dalam S', palsu sebaliknya. Dalam erti kata lain, satu set (jenis data abstrak) boleh diwakili melalui fungsi dalam TypeScript.
npm run plane
Dalam bahagian seterusnya, kita akan melihat cara untuk mewakili beberapa set asas dalam algebra set melalui TypeScript dengan cara yang berfungsi, kemudian kita akan mentakrifkan operasi binari generik pada set. Kami kemudiannya akan menggunakan operasi ini pada nombor kemudian pada subset satah Euclidean. Set ialah struktur data abstrak, subset nombor dan subset bagi satah Euclidean ialah perwakilan struktur data abstrak, dan akhirnya operasi binari ialah logik generik yang berfungsi pada sebarang perwakilan struktur data abstrak.
Bahagian ini memperkenalkan perwakilan beberapa set asas dalam algebra set melalui TypeScript.
Biar E sebagai set kosong dan Kosongkan fungsi cirinya. Dalam algebra set, E ialah set unik yang tidak mempunyai unsur. Oleh itu, Kosong boleh ditakrifkan seperti berikut:
npm run fractals
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Dalam algebra set, Empty diwakili seperti berikut:
Oleh itu, jalankan kod di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
memberi keputusan berikut:
Biar S ialah satu set dan S' ialah subset bagi S yang mengandungi semua elemen dan Semua Fungsi cirinya. Dalam algebra set, S' ialah set penuh yang mengandungi semua elemen. Oleh itu, Semua boleh ditakrifkan seperti ini:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Oleh itu, perwakilan S' dalam TypeScript boleh ditakrifkan seperti berikut:
type Set<T> = (x: T) => boolean
Dalam algebra set, Semua diwakili seperti berikut:
Oleh itu, jalankan kod di bawah:
npm install
memberi keputusan berikut:
Biar E sebagai set Singleton dan Singleton fungsi cirinya. Dalam algebra set, E juga dikenali sebagai set unit, atau 1-tuple ialah set dengan tepat satu elemen e. Oleh itu, Singleton boleh ditakrifkan seperti berikut:
npm run numbers
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
npm run plane
Oleh itu, jalankan kod di bawah:
npm run fractals
memberi keputusan berikut:
Bahagian ini membentangkan subset set integer.
Biar E ialah set nombor genap dan Genap Fungsi cirinya. Dalam matematik, nombor genap ialah nombor yang merupakan gandaan dua. Oleh itu, Even boleh ditakrifkan seperti berikut:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Oleh itu, jalankan kod di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
memberi keputusan berikut:
Biar E ialah set nombor ganjil dan Ganjil fungsi cirinya. Dalam matematik, nombor ganjil ialah nombor yang bukan gandaan dua. Oleh itu, Ganjil boleh ditakrifkan seperti berikut:
type Set<T> = (x: T) => boolean
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
Empty(x) = false if x is in E Empty(x) = false if x is not in E
Oleh itu, jalankan kod di bawah:
const empty = () => (e: T) => false
memberi keputusan berikut:
Biar E ialah set gandaan 3 dan MultipleOfThree Fungsi cirinya. Dalam matematik, gandaan 3 ialah nombor yang boleh dibahagikan dengan 3. Oleh itu, MultipleOfThree boleh ditakrifkan seperti berikut:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
All(x) = true if x is in S
Oleh itu, jalankan kod di bawah:
const all = () => (e: T) => true
memberi keputusan berikut:
Biar E ialah set gandaan 5 dan MultipleOfFive fungsi cirinya. Dalam matematik, gandaan 5 ialah nombor yang boleh dibahagikan dengan 5. Oleh itu, MultipleOfFive boleh ditakrifkan seperti berikut:
npm install
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
npm run numbers
Oleh itu, jalankan kod di bawah:
npm run plane
memberi keputusan berikut:
Dulu, semasa saya bermain dengan masalah Project Euler, saya terpaksa menyelesaikan masalah berikut:
npm run fractals
Untuk menyelesaikan masalah ini, mula-mula saya perlu menulis algoritma pantas yang menyemak sama ada nombor yang diberikan adalah perdana atau tidak. Setelah algoritma ditulis, saya menulis algoritma berulang yang berulang melalui nombor perdana sehingga nombor perdana ke-10 001 ditemui.
Biar E ialah set nombor perdana dan Perdana fungsi cirinya. Dalam matematik, perdana ialah nombor asli yang lebih besar daripada 1 yang tidak mempunyai pembahagi positif selain daripada 1 dan dirinya sendiri. Oleh itu, Prime boleh ditakrifkan seperti berikut:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Oleh itu, jalankan kod di bawah untuk menyelesaikan masalah kami:
S'(a) = S'(b) = true S'(c) = S'(d) = false
di mana getPrime ditakrifkan di bawah:
type Set<T> = (x: T) => boolean
memberi keputusan berikut:
Bahagian ini membentangkan beberapa operasi asas untuk membina set baharu daripada set yang diberikan dan untuk memanipulasi set. Di bawah rajah Ven dalam algebra set.
Biar E dan F ialah dua set. kesatuan E dan F, dilambangkan dengan E U F ialah set semua elemen yang merupakan ahli sama ada E dan F.
Biar Kesatuan menjadi operasi kesatuan. Oleh itu, operasi Kesatuan boleh dilaksanakan seperti berikut dalam TypeScript:
Empty(x) = false if x is in E Empty(x) = false if x is not in E
Menjalankan kod di bawah:
const empty = () => (e: T) => false
memberi keputusan berikut:
Biar E dan F ialah dua set. persimpangan E dan F, dilambangkan dengan E n F ialah set semua elemen yang merupakan ahli E dan F.
Biar Persimpangan menjadi operasi persimpangan. Oleh itu, operasi Persimpangan boleh dilaksanakan seperti berikut dalam TypeScript:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
Menjalankan kod di bawah:
All(x) = true if x is in S
memberi keputusan berikut:
Biar E dan F ialah dua set. hasil cartesian E dan F, dilambangkan dengan E × F ialah set semua pasangan tertib (e, f) supaya e ialah ahli E dan f ialah ahli F.
Biar CartesianProduct menjadi operasi produk cartesian. Oleh itu, operasi CartesianProduct boleh dilaksanakan seperti berikut dalam TypeScript:
npm install
Menjalankan kod di bawah:
npm run numbers
memberi keputusan berikut:
Biar E dan F ialah dua set. pelengkap relatif F dalam E, dilambangkan dengan E F ialah set semua elemen yang merupakan ahli E tetapi bukan ahli F.
Biar Pelengkap menjadi operasi pelengkap relatif. Oleh itu, operasi Pelengkap boleh dilaksanakan seperti berikut dalam TypeScript:
npm run planeMenjalankan kod di bawah:
npm run fractals
memberi keputusan berikut:
Biar E dan F ialah dua set. perbezaan simetri bagi E dan F, dilambangkan dengan E Δ F ialah set semua elemen yang merupakan ahli sama ada E dan F tetapi bukan dalam persilangan E dan F.
Biar SymmetricDifference menjadi operasi symmetric difference. Oleh itu, operasi SymmetricDifference boleh dilaksanakan dalam dua cara dalam TypeScript. Cara yang remeh ialah menggunakan kesatuan dan operasi pelengkap seperti berikut:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Cara lain ialah menggunakan operasi binari XOR seperti berikut:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Menjalankan kod di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
memberi keputusan berikut:
Bahagian ini membentangkan operasi binari lain yang berguna pada set.
Let Contains menjadi operasi yang menyemak sama ada elemen berada dalam set atau tidak. Operasi ini ialah fungsi yang mengambil sebagai parameter elemen dan mengembalikan benar jika elemen berada dalam set, palsu sebaliknya.
Oleh itu, operasi ini ditakrifkan seperti berikut dalam TypeScript:
type Set<T> = (x: T) => boolean
Oleh itu, jalankan kod di bawah:
npm install
memberi keputusan berikut:
Biar Tambah sebagai operasi yang menambah elemen pada set. Operasi ini ialah fungsi yang mengambil elemen sebagai parameter dan menambahkannya pada set.
Oleh itu, operasi ini ditakrifkan seperti berikut dalam TypeScript:
npm run numbers
Oleh itu, jalankan kod di bawah:
npm run plane
memberi keputusan berikut:
Biar Alih keluar sebagai operasi yang mengalih keluar elemen daripada set. Operasi ini ialah fungsi yang mengambil sebagai parameter elemen dan mengeluarkannya daripada set.
Oleh itu, operasi ini ditakrifkan seperti berikut dalam TypeScript:
npm run fractals
Oleh itu, jalankan kod di bawah:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
memberi keputusan berikut:
Anda boleh melihat betapa mudahnya kita boleh melakukan beberapa algebra set dalam TypeScript melalui Pengaturcaraan Fungsian. Dalam bahagian sebelumnya telah ditunjukkan definisi yang paling asas. Tetapi, Jika anda ingin pergi lebih jauh, anda boleh fikirkan tentang:
Dalam bahagian sebelumnya, konsep asas pada set telah dilaksanakan dalam TypeScript. Dalam bahagian ini, kita akan mempraktikkan konsep yang dilaksanakan pada satah Euclidean.
Cakera ialah subset bagi satah yang dibatasi oleh bulatan. Terdapat dua jenis cakera. Cakera Tertutup iaitu cakera yang mengandungi titik bulatan yang membentuk sempadannya dan cakera Buka iaitu cakera yang tidak mengandungi titik bulatan yang membentuk sempadannya.
Dalam bahagian ini, kami akan menyediakan Fungsi ciri cakera Tertutup dan melukisnya dalam halaman HTML5.
Untuk menyediakan Fungsi ciri, pertama sekali kita memerlukan fungsi yang mengira Jarak Euclidean antara dua titik dalam satah. Fungsi ini dilaksanakan seperti berikut:
S'(a) = S'(b) = true S'(c) = S'(d) = false
di mana Titik ditakrifkan di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Formula ini berdasarkan Teorem Pythagoras.
di mana c ialah jarak Euclidean, a² ialah (p1.X - p2.X)² dan b² ialah (p1.Y - p2.Y)².
Biar Cakera menjadi Fungsi ciri cakera tertutup. Dalam algebra set, takrifan cakera tertutup dalam set real adalah seperti berikut:
di mana a dan b ialah koordinat pusat dan R jejari.
Oleh itu, pelaksanaan Cakera dalam TypeScript adalah seperti berikut:
npm install
Untuk melihat set dalam halaman HTML5, saya memutuskan untuk melaksanakan cabutan fungsi yang melukis set dalam satah Euclidean. Saya memilih HTML5 dan dengan itu menggunakan elemen kanvas untuk melukis.
Oleh itu, saya telah membina satah Euclidean yang digambarkan di bawah melalui cabutan kaedah.
Di bawah pelaksanaan pesawat.
npm run numbers
Dalam fungsi cabutan, kanvas yang mempunyai lebar dan ketinggian yang sama dengan bekas Satah Euclidean dicipta. Kemudian setiap titik dalam piksel (x,y) kanvas digantikan dengan titik hitam jika ia tergolong dalam set. xMin, xMax, yMin dan yMax ialah nilai sempadan yang digambarkan dalam rajah satah Euclidean di atas.
Menjalankan kod di bawah:
npm run plane
di mana cakera ialah id kanvas:
npm run fractals
memberi keputusan berikut:
Separuh satah mendatar atau menegak ialah salah satu daripada dua subset di mana satah membahagikan ruang Euclidean. Separuh satah mendatar ialah salah satu daripada dua subset yang mana sebuah satah membahagi ruang Euclidean melalui garis berserenjang dengan paksi Y seperti dalam rajah di atas. menegak separuh satah ialah salah satu daripada dua subset di mana sebuah satah membahagikan ruang Euclidean melalui garis berserenjang dengan paksi X.
Dalam bahagian ini, kami akan menyediakan Fungsi ciri bagi mendatar dan menegak satah separuh, melukisnya dalam halaman HTML5 dan lihat apa kita boleh lakukan jika kita menggabungkannya dengan subset cakera.
Biar HorizontalHalfPlane menjadi Fungsi ciri bagi mendatar separuh satah. Pelaksanaan HorizontalHalfPlane dalam TypeScript adalah seperti berikut:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Oleh itu, jalankan kod di bawah:
npm install
di mana hhp ialah id kanvas:
npm run numbers
memberi keputusan berikut:
Biar VerticalHalfPlane menjadi Fungsi ciri bagi menegak separuh satah. Pelaksanaan VerticalHalfPlane dalam TypeScript adalah seperti berikut:
npm run planeOleh itu, jalankan kod di bawah:
npm run fractals
di mana vhd ialah id kanvas:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
memberi keputusan berikut:
Dalam bahagian pertama artikel, kami menyediakan operasi binari asas pada set. Oleh itu, dengan menggabungkan persilangan cakera dan separuh satah contohnya, kita boleh melukis subset separuh cakera.
Oleh itu, jalankan sampel di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
di mana hd ialah id kanvas:
S'(a) = S'(b) = true S'(c) = S'(d) = false
memberi keputusan berikut:
Bahagian ini membentangkan fungsi pada set dalam satah Euclidean.
Biar translatePoint menjadi fungsi yang menterjemahkan titik dalam satah. Dalam geometri Euclidean, translatePoint ialah fungsi yang menggerakkan titik tertentu pada jarak tetap dalam arah tertentu. Oleh itu pelaksanaan dalam TypeScript adalah seperti berikut:
type Set<T> = (x: T) => boolean
di mana (deltax, deltay) ialah vektor malar terjemahan.
Biar terjemah menjadi fungsi yang menterjemah set dalam pesawat. Fungsi ini hanya dilaksanakan seperti berikut dalam TypeScript:
Empty(x) = false if x is in E Empty(x) = false if x is not in E`terjemah` mengambil sebagai parameter `deltax` iaitu jarak delta dalam dimensi Euclidean pertama dan `deltay` iaitu jarak delta dalam dimensi Euclidean kedua. Jika titik _P (x, y)_ diterjemahkan dalam set _S_, maka koordinatnya akan berubah kepada _(x', y') = (x, delatx, y, deltay)_. Oleh itu, titik _(x' - delatx, y' - deltay)_ akan sentiasa tergolong dalam set _S_. Dalam algebra set, `terjemah` dipanggil isomorf, dengan kata lain, set semua terjemahan membentuk _kumpulan terjemahan T_, yang isomorfik kepada ruang itu sendiri. Ini menerangkan logik utama fungsi. Oleh itu, jalankan kod di bawah dalam halaman HTML5 kami:
const empty = () => (e: T) => false
di mana ep_op ialah id kanvas:
console.log('\nEmpty set:') console.log('Is 7 in {}?', common.empty()(7))
memberi keputusan berikut:
Biar scalePoint menjadi fungsi yang menghantar sebarang titik M ke titik lain N supaya segmen SN berada pada baris yang sama dengan SM , tetapi diskalakan oleh faktor λ. Dalam algebra set, Skala dirumus seperti berikut:
Oleh itu pelaksanaan dalam TypeScript adalah seperti berikut:
npm install
di mana (deltax, deltay) ialah vektor malar terjemahan dan (lambdax, lambday) ialah vektor lambda.
Biar skala sebagai fungsi yang menggunakan homotheti pada set dalam pelan. Fungsi ini hanya dilaksanakan seperti berikut dalam TypeScript:
npm run numbers
skala diambil sebagai parameter deltax iaitu jarak delta dalam dimensi Euclidean pertama, deltay iaitu jarak delta dalam dimensi Euclidean kedua dan (lambdax, lambday) iaitu vektor faktor malar λ. Jika titik P (x, y) diubah melalui skala dalam set S, maka koordinatnya akan bertukar kepada (x', y') = (lambdax * x, delatx, lambday * y, deltay). Oleh itu, titik ((x'- delatx)/lambdax, (y' - deltay)/lambday) akan sentiasa tergolong dalam set S, Jika lambda berbeza daripada vektor 0, sudah tentu. Dalam algebra set, skala dipanggil isomorf, dengan kata lain, set semua homotheti membentuk kumpulan Homothety H, iaitu isomorfik kepada ruang itu sendiri {0}. Ini menerangkan logik utama fungsi.
Oleh itu, jalankan kod di bawah dalam halaman HTML5 kami:
npm run plane
memberi keputusan berikut:
Biar rotatePoint sebagai fungsi yang memutarkan titik dengan sudut θ. Dalam algebra matriks, rotatePoint dirumuskan seperti berikut:
di mana (x', y') ialah koordinat titik selepas putaran, dan formula untuk x' dan y' ialah seperti berikut:
Demonstrasi formula ini sangat mudah. Sila lihat putaran ini.
Di bawah demonstrasi:
Oleh itu pelaksanaan dalam TypeScript adalah seperti berikut:
npm install
Biar putar menjadi fungsi yang menggunakan putaran pada set dalam satah dengan sudut θ. Fungsi ini hanya dilaksanakan seperti berikut dalam TypeScript.
npm run numbers
putar ialah fungsi yang mengambil sebagai parameter theta iaitu sudut putaran. Jika titik P (x, y) diubah melalui putaran dalam set S, maka koordinatnya akan bertukar kepada (x', y') = (x * cos(theta) - y * sin(theta), x * sin(theta), y * cos(theta)). Oleh itu, titik (x' * cos(theta), y' * sin(theta), y' * cos(theta) - x' * sin(theta)) akan sentiasa tergolong dalam set S. Dalam algebra set, putaran dipanggil isomorf, dengan kata lain, set semua putaran membentuk Kumpulan putaran R, iaitu isomorfik kepada ruang itu sendiri. Ini menerangkan logik utama fungsi.
Oleh itu, jalankan kod di bawah dalam halaman HTML5 kami:
npm run plane
memberi keputusan berikut:
Sangat mudah, bukan? Bagi mereka yang ingin pergi lebih jauh, anda boleh meneroka ini:
Fraktal ialah set yang mempunyai dimensi fraktal yang biasanya melebihi dimensi topologinya dan mungkin jatuh di antara integer. Sebagai contoh, set Mandelbrot ialah fraktal yang ditakrifkan oleh keluarga polinomial kuadratik kompleks:
npm run fractals
di mana c ialah kompleks. Fraktal Mandelbrot ditakrifkan sebagai set semua titik c supaya jujukan di atas tidak terlepas ke infiniti. Dalam algebra set, ini dirumuskan seperti berikut:
Fraktal (jenis data abstrak) sentiasa boleh diwakili seperti berikut dalam TypeScript:
S'(x) = true if x is in S' S'(x) = false if x is not in S'
Untuk dapat melukis fraktal, saya perlu memanipulasi nombor Kompleks. Oleh itu, saya mencipta kelas Kompleks di bawah:
S'(a) = S'(b) = true S'(c) = S'(d) = false
Saya mencipta Fraktal Mandelbrot (perwakilan jenis data abstrak) P(z) = z^2 c yang tersedia di bawah.
npm installUntuk dapat melukis nombor _Complex_, saya mencipta kelas `ComplexPlane`. Di bawah ialah pelaksanaan dalam TypeScript.
npm run numbers
Oleh itu, jalankan kod di bawah:
npm run plane
di mana fraktal ialah id kanvas:
npm run fractals
memberi keputusan berikut:
Bagi mereka yang ingin pergi lebih jauh, anda boleh meneroka ini:
Itu sahaja! Saya harap anda seronok membaca.
Atas ialah kandungan terperinci Pengaturcaraan Fungsional dalam TypeScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!