Anda tampaknya memiliki pola pikir "struktur data dan algoritma" yang terlalu berlebihan. Tidak setiap pohon adalah semacam pohon pencarian. Struktur data sering dirancang untuk sesuai atau menangkap aspek model domain.
S-ekspresi hampir persis pohon mawar. (Atau lebih tepatnya, saya akan mengatakan bagaimana mereka biasanya dianggap sebagai pohon mawar. Wikipedia benar dalam mengatakan mereka lebih seperti pohon biner, tetapi apa yang Anda sebut "benar" S-ekspresi hanya sedikit berbeda dari pohon mawar.) Bagaimanapun, Anda dapat menggunakannya sebagai representasi umum untuk pohon sintaksis abstrak. Manfaat melakukan ini adalah Anda dapat dengan mudah menulis operasi generik, misalnya "temukan semua variabel" atau "parameter swap" atau "ganti nama simbol ini". Ini juga dapat diperluas dalam menambahkan tipe baru node ke sintaksis abstrak Anda sering tidak memerlukan perubahan apa pun. Kelemahannya sebenarnya tidak ada kendala, jadi itu bukan apriori yang mencegah Anda menulis omong kosong. Ini dapat dikurangi untuk pengguna dengan teknik tipe data abstrak standar, tetapi pelaksana transformasi dan semacamnya harus berurusan dengan representasi yang tidak terstruktur meskipun mereka "tahu" bahwa input disusun melalui invarian tipe data. Tentu saja, ketika kepastian itu salah tempat (mungkin karena hal-hal telah berubah), kesalahan cenderung tidak dapat diprediksi dan sulit untuk di-debug.
Dalam praktiknya, sementara Data.Tree
modul di perpustakaan standar menyediakan pohon mawar, hampir tidak ada yang menggunakannya di komunitas Haskell. Menentukan tipe data khusus yang secara eksplisit menangkap kendala sangat mudah sehingga hanya ada sedikit alasan untuk menggunakan tipe perpustakaan umum. Lebih jauh, ada sejumlah besar penelitian dan praktik seputar melakukan operasi generik terhadap tipe kustom yang menghilangkan banyak manfaat menggunakan representasi generik. Akhirnya, Haskellers cenderung sangat mendukung kendala eksplisit dan ditegakkan dan bersedia membayar untuk mendapatkannya.
Untuk menjawab pertanyaan terakhir Anda, seringkali mencari AST tidak penting dan / atau AST umumnya dianggap cukup kecil sehingga hanya berjalan semuanya dapat diterima. Memang, tidak jarang untuk mengumpulkan definisi dalam struktur data terpisah dengan referensi ke AST yang dapat dilihat sebagai semacam indeks. Demikian pula, beberapa pass optimasi akan (biasanya secara lokal dan sementara) membangun indeks untuk menyederhanakan dan mempercepat operasi mereka. Struktur AST sesuai dengan input sehingga tidak dapat "diseimbangkan kembali" atau semacamnya. Karena itu, tidak biasa bagi AST itu sendiri berisi informasi pengindeksan atau informasi untuk membantu "pencarian".