Adalah umum untuk menggabungkan dua atau lebih fungsi/metode dan bekerja secara keseluruhan. Sebagai contoh:

Untuk "menggabungkan" fungsi dalam javascript secara fungsional?

Apakah mungkin di C++ 11 untuk menggabungkan fungsi menjadi fungsi baru?

Namun, saya bertanya-tanya apakah sesuatu seperti ini dapat dilakukan:

Function<Integer, Integer> f = x -> x + 1;
Function<Integer, Integer> g = x -> x * 2;
Function<Integer, Integer> h = f.compose(g);
** **
h.toString  //get x-> x*2+1 , what I want

Fungsi-fungsinya digabungkan secara "dalam", yang mirip dengan penyederhanaan ekspresi dalam perangkat lunak matematika seperti Matlab.

Saya tahu ada beberapa teknik yang berguna dalam kompilator dan saya mencari bagaimana hal itu dapat dilakukan dalam bahasa tingkat tinggi.

Omong-omong, saya kira secara teoritis mungkin menggunakan manipulasi bytecode JVM tetapi itu akan terlalu rumit.

0
ntl01 1 Juli 2020, 14:21

1 menjawab

Jawaban Terbaik

Perhatikan bahwa bahasa biasanya tidak menentukan pengoptimalan (kemungkinan) yang akan diterapkan. Pengoptimalan didelegasikan ke kompiler dan sistem runtime.

Bahasa fungsional, seperti Haskell, menyediakan banyak fitur komposisi berbasis fungsi yang memungkinkan pengoptimalan yang ditargetkan. Anda dapat melihat komposisi fungsi, evaluasi malas, aplikasi parsial dan fungsi tingkat tinggi.

Harap dicatat bahwa banyak pekerjaan telah dilakukan mengenai kasus spesifik dari perhitungan berbasis urutan. Lihat generator dengan Python atau konsep yang lebih umum/abstrak yang disebut rentang. Rentang tersedia misalnya dalam bahasa pemrograman D dan C++20. Komposisi dan optimasi rentang dicapai pada tingkat yang agak rendah dan kompiler umumnya tidak bertanggung jawab atas optimasi spesifik mereka.

Terakhir, beberapa kompiler mampu melakukan transformasi tingkat tinggi yang cukup pintar (lihat model polihedral untuk loop , pengoptimalan antar-prosedural untuk fungsi).

0
Jérôme Richard 1 Juli 2020, 12:31