Rumah > hujung hadapan web > tutorial js > Pengaturcaraan Fungsional dalam TypeScript

Pengaturcaraan Fungsional dalam TypeScript

Patricia Arquette
Lepaskan: 2024-10-19 22:32:29
asal
720 orang telah melayarinya

Functional Programming in TypeScript

kandungan

  1. Pengenalan
  2. Persekitaran TypeScript
  3. Mewakili Data Melalui Fungsi
    1. Set
    2. Operasi Binari
    3. Pergi Lebih Jauh
  4. Satah Euclidean
    1. Melukis Cakera
    2. Melukis satah Separuh Mendatar dan Menegak
    3. Fungsi
    4. Pergi Lebih Jauh
  5. Fraktal
    1. Nombor Kompleks dan Lukisan
    2. Fraktal Mandelbrot
    3. Pergi Lebih Jauh

Anda boleh mencari kod sumber di sini: https://github.com/aelassas/functional-ts

pengenalan

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:

  • Argumen fungsi tertib tinggi
  • Hasil fungsi tertib lebih tinggi
  • Fungsi bersarang
  • Fungsi tanpa nama
  • Penutupan
  • Aplikasi separa (ECMAScript 5)

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.

Persekitaran TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk menjalankan demo nombor, jalankan arahan berikut:

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk menjalankan demo pesawat Euclidean, jalankan arahan berikut:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk menjalankan demo fraktal, jalankan arahan berikut:

npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mewakili Data Melalui Fungsi

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.

set

Bahagian ini memperkenalkan perwakilan beberapa set asas dalam algebra set melalui TypeScript.

Set kosong

Functional Programming in 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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam algebra set, Empty diwakili seperti berikut:

Functional Programming in TypeScript

Oleh itu, jalankan kod di bawah:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Tetapkan Semua

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan S' dalam TypeScript boleh ditakrifkan seperti berikut:

type Set<T> = (x: T) => boolean
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam algebra set, Semua diwakili seperti berikut:

Functional Programming in TypeScript

Oleh itu, jalankan kod di bawah:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Set Singleton

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Set Lain

Bahagian ini membentangkan subset set integer.

Nombor Genap

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Nombor Ganjil

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

const empty = () => (e: T) => false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Gandaan 3

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))
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:

All(x) = true if x is in S
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

const all = () => (e: T) => true
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Gandaan 5

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Nombor Perdana

Dulu, semasa saya bermain dengan masalah Project Euler, saya terpaksa menyelesaikan masalah berikut:

npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, perwakilan E dalam TypeScript boleh ditakrifkan seperti berikut:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah untuk menyelesaikan masalah kami:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana getPrime ditakrifkan di bawah:

type Set<T> = (x: T) => boolean
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Operasi Binari

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.

Functional Programming in TypeScript

Kesatuan

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menjalankan kod di bawah:

const empty = () => (e: T) => false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

persimpangan

Functional Programming in TypeScript

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))
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menjalankan kod di bawah:

All(x) = true if x is in S
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Produk Cartesian

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menjalankan kod di bawah:

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Pelengkap

Functional Programming in TypeScript

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 plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Menjalankan kod di bawah:
npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Perbezaan simetri

Functional Programming in TypeScript

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Cara lain ialah menggunakan operasi binari XOR seperti berikut:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menjalankan kod di bawah:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Operasi Lain

Bahagian ini membentangkan operasi binari lain yang berguna pada set.

Mengandungi

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Tambah

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Alih keluar

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

S'(x) = true if x is in S'
S'(x) = false if x is not in S'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Bagi Mereka Yang Ingin Melangkah Lebih Jauh

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:

  • Hubungan melebihi set
  • Algebra abstrak, seperti monoid, kumpulan, medan, gelang, ruang K-vektoral dan sebagainya
  • Prinsip kemasukan-pengecualian
  • Paradoks Russell
  • Paradoks Cantor
  • Ruang vektor dwi
  • Teorem dan Korolari

Satah Euclidean

Dalam bahagian sebelumnya, konsep asas pada set telah dilaksanakan dalam TypeScript. Dalam bahagian ini, kita akan mempraktikkan konsep yang dilaksanakan pada satah Euclidean.

Melukis Cakera

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana Titik ditakrifkan di bawah:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Formula ini berdasarkan Teorem Pythagoras.

Functional Programming in TypeScript

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:

Functional Programming in TypeScript

di mana a dan b ialah koordinat pusat dan R jejari.

Oleh itu, pelaksanaan Cakera dalam TypeScript adalah seperti berikut:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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.

Functional Programming in TypeScript

Di bawah pelaksanaan pesawat.

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana cakera ialah id kanvas:

npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Melukis Satah Separuh Mendatar dan Menegak

Functional Programming in TypeScript

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana hhp ialah id kanvas:

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Biar VerticalHalfPlane menjadi Fungsi ciri bagi menegak separuh satah. Pelaksanaan VerticalHalfPlane dalam TypeScript adalah seperti berikut:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Oleh itu, jalankan kod di bawah:
npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana vhd ialah id kanvas:

S'(x) = true if x is in S'
S'(x) = false if x is not in S'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana hd ialah id kanvas:

S'(a) = S'(b) = true
S'(c) = S'(d) = false
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Fungsi

Bahagian ini membentangkan fungsi pada set dalam satah Euclidean.

Terjemah

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
`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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana ep_op ialah id kanvas:

console.log('\nEmpty set:')
console.log('Is 7 in {}?', common.empty()(7))
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Homoteti

Functional Programming in TypeScript

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:

Functional Programming in TypeScript

Oleh itu pelaksanaan dalam TypeScript adalah seperti berikut:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Putar

Functional Programming in TypeScript

Biar rotatePoint sebagai fungsi yang memutarkan titik dengan sudut θ. Dalam algebra matriks, rotatePoint dirumuskan seperti berikut:

Functional Programming in TypeScript

di mana (x', y') ialah koordinat titik selepas putaran, dan formula untuk x' dan y' ialah seperti berikut:

Functional Programming in TypeScript

Demonstrasi formula ini sangat mudah. Sila lihat putaran ini.

Functional Programming in TypeScript

Di bawah demonstrasi:

Functional Programming in TypeScript

Oleh itu pelaksanaan dalam TypeScript adalah seperti berikut:

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Biar putar menjadi fungsi yang menggunakan putaran pada set dalam satah dengan sudut θ. Fungsi ini hanya dilaksanakan seperti berikut dalam TypeScript.

npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Bagi Mereka Yang Ingin Melangkah Lebih Jauh

Sangat mudah, bukan? Bagi mereka yang ingin pergi lebih jauh, anda boleh meneroka ini:

  • Ellipse
  • Ruang Euclidean tiga dimensi
  • Ellipsoide
  • Paraboloid
  • Hiperboloid
  • Harmonik sfera
  • Superellipsoid
  • Haumea
  • Homoeoid
  • Focaloid

Fraktal

Functional Programming in TypeScript

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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:

Functional Programming in TypeScript

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'
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Nombor Kompleks dan Lukisan

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Fraktal Mandelbrot

Saya mencipta Fraktal Mandelbrot (perwakilan jenis data abstrak) P(z) = z^2 c yang tersedia di bawah.

npm install
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Untuk dapat melukis nombor _Complex_, saya mencipta kelas `ComplexPlane`. Di bawah ialah pelaksanaan dalam TypeScript.
npm run numbers
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Oleh itu, jalankan kod di bawah:

npm run plane
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

di mana fraktal ialah id kanvas:

npm run fractals
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

memberi keputusan berikut:

Functional Programming in TypeScript

Bagi Mereka Yang Ingin Melangkah Lebih Jauh

Bagi mereka yang ingin pergi lebih jauh, anda boleh meneroka ini:

  • Fraktal Newton
  • Julia Fractals
  • Fraktal Lain

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan