Apakah Fungsi Tingkat Tinggi menyediakan lebih banyak daya untuk Pemrograman Fungsional?

13

Saya telah mengajukan pertanyaan serupa di cstheory.SE .

Menurut jawaban ini pada Stackoverflow ada algoritma yang pada bahasa pemrograman fungsional murni non-malas memiliki kompleksitas , sedangkan algoritma yang sama dalam pemrograman imperatif adalah Ω ( n ) . Menambahkan kemalasan ke bahasa FP akan membuat algoritma Ω ( n ) .Ω(nlogn)Ω(n)Ω(n)

Apakah ada hubungan setara yang membandingkan bahasa FP dengan dan tanpa Fungsi Pesanan Tinggi? Apakah masih Turing Lengkap? Jika ya, apakah kurangnya Orde Tinggi pada FP membuat bahasa kurang "kuat" atau efisien?

vz0
sumber
Bahasa FP mana ?
reinierpost
Fungsi tingkat tinggi dan evaluasi malas tidak sama, afaik. Jadi pertanyaan Anda tentang apa?
Raphael

Jawaban:

11

Dalam bahasa pemrograman fungsional yang cukup kuat (misalnya, dengan tipe data untuk menerapkan penutupan ) Anda dapat menghilangkan semua penggunaan urutan yang lebih tinggi dengan transformasi defungsionalisasi . Karena metode ini digunakan untuk mengkompilasi jenis bahasa ini, Anda dapat beranggapan bahwa ini tidak memengaruhi kinerja dan bahwa dalam pengaturan ini, tatanan yang lebih tinggi tidak membuat bahasa menjadi kurang kuat. Namun itu tidak mempengaruhi cara menulis kode.

Namun jika bahasanya tidak cukup kuat, maka ya, tatanan yang lebih tinggi memang memberikan kekuatan ekspresif. Pertimbangkan kalkulus lambda: tanpa fungsi tingkat tinggi, ia benar-benar tidak dapat melakukan apa pun, sebagian besar karena tipe data paling dasar (integer, boolean) diimplementasikan menggunakan fungsi.

Kesimpulannya, itu sangat tergantung pada bahasa.


Di atas adalah jawaban saya. Di bawah, komentar tentang asumsi umum tentang bahasa imperatif.

tentang sebuah algoritma yang pada bahasa pemrograman fungsional non-malas memiliki kompleksitas , sedangkan algoritma yang sama dalam pemrograman imperatif adalah Ω ( n ) . Menambahkan kemalasan ke bahasa FP akan membuat algoritma Ω ( n ) .Ω(nlogn)Ω(n)Ω(n)

Saya ingin melihat referensi ini. Asumsi yang biasa adalah bahwa akses ke array panjang dalam RAM adalah dalam waktu O ( 1 ) dan setara dalam FP murni adalah dalam waktu O ( log n ) . Itu tidak sepenuhnya benar: waktu akses dalam RAM adalah dalam O ( lognO(1)O(logn) mana m adalah ukuran memori. Tentu saja, m n . Dalam praktiknya mengakses elemen array jauh lebih cepat. Alasannya adalah bahwa m dibatasi tetapi ... begitu juga n !O(logm)mmnmn

SUNTING: terima kasih atas tautannya (tautan untuk makalah tentang kemalasan tidak tersedia, berikut ini adalah satu lagi ). Seperti yang diposting di komentar dan di atas dalam jawaban saya, model RAM sedikit tidak adil untuk FP murni dengan memberikan waktu pencarian bahkan ketika ukuran satu alamat tidak dibatasi. Saya belum mengerti bagaimana trik malas bekerja tetapi saya pikir penting untuk dicatat bahwa ini hanya untuk masalah khusus ini.O(1)

jmad
sumber
4

Itu tergantung pada apa yang Anda maksud dengan ekspresif.

Berikut adalah argumen bahwa orde tinggi memang menambahkan sesuatu: dengan bahasa orde pertama, rekursi primitif tidak cukup untuk mengekspresikan fungsi Ackermann . Namun, dengan adanya fungsi tingkat tinggi, rekursi primitif sudah cukup:

Ackermann 0=λx.x+1Ackermann (m+1)=Iter (Ackermann m)Iter f 0=f 1Iter f (n+1)=f (Iter f n)

Ini mendefinisikan fungsi Ackermann menggunakan rekursi primitif saja.

IterIterNkNkIter(NN)(NN)

Martin Berger
sumber