Bạn dường như có một tư duy "cấu trúc dữ liệu và thuật toán" quá mức. Không phải mỗi cây là một loại cây tìm kiếm. Cấu trúc dữ liệu thường được thiết kế để tương ứng hoặc nắm bắt các khía cạnh của mô hình miền.
Biểu thức S gần như chính xác là cây hoa hồng. (Hay đúng hơn, tôi sẽ nói cách chúng thường được coi là cây hoa hồng. Wikipedia đúng khi nói chúng giống cây nhị phân hơn, nhưng những gì bạn có thể gọi là biểu thức S "đúng" chỉ khác một chút so với cây hoa hồng.) Ở bất kỳ giá nào, bạn có thể sử dụng chúng làm đại diện chung cho cây cú pháp trừu tượng. Lợi ích của việc này là bạn có thể dễ dàng viết các thao tác chung, ví dụ: "tìm tất cả các biến" hoặc "tham số hoán đổi" hoặc "đổi tên biểu tượng này". Nó cũng có thể mở rộng ở chỗ việc thêm một loại nút mới vào cú pháp trừu tượng của bạn thường không yêu cầu thực sự thay đổi bất cứ điều gì. Nhược điểm là thực sự không có bất kỳ ràng buộc nào, vì vậy nó không phải là một tiên nghiệm ngăn bạn viết vô nghĩa. Điều này có thể được giảm thiểu cho người dùng bằng các kỹ thuật loại dữ liệu trừu tượng tiêu chuẩn, nhưng người thực hiện các phép biến đổi và như vậy phải xử lý biểu diễn phi cấu trúc mặc dù họ "biết" rằng đầu vào được cấu trúc thông qua bất biến kiểu dữ liệu. Tất nhiên, khi sự chắc chắn đó bị đặt sai chỗ (có thể do mọi thứ đã thay đổi), các lỗi có xu hướng không thể đoán trước và khó gỡ lỗi.
Trong thực tế, trong khi Data.Tree
mô-đun trong các thư viện tiêu chuẩn cung cấp một cây hoa hồng, hầu như không ai sử dụng nó trong cộng đồng Haskell. Việc xác định các loại dữ liệu tùy chỉnh nắm bắt rõ ràng các ràng buộc rất dễ dàng đến mức có rất ít lý do để sử dụng một loại thư viện chung. Hơn nữa, đã có một lượng lớn nghiên cứu và thực hành xung quanh việc thực hiện các hoạt động chung đối với các loại tùy chỉnh giúp loại bỏ nhiều lợi ích của việc sử dụng một đại diện chung. Cuối cùng, Haskeller có xu hướng rất ủng hộ các ràng buộc rõ ràng, được thi hành và sẵn sàng trả tiền để có được nó.
Để trả lời câu hỏi cuối cùng của bạn, thông thường việc tìm kiếm AST là không quan trọng và / hoặc AST thường được coi là đủ nhỏ để chỉ cần đi bộ toàn bộ là có thể chấp nhận được. Phải thừa nhận rằng, không có gì lạ khi thu thập các định nghĩa trong một cấu trúc dữ liệu riêng biệt với các tham chiếu vào AST có thể được xem như một loại chỉ mục. Tương tự, một số vượt qua tối ưu hóa sẽ (thường là cục bộ và tạm thời) xây dựng các chỉ mục để đơn giản hóa và tăng tốc hoạt động của chúng. Cấu trúc của AST tương ứng với đầu vào và do đó, nó không thể được "cân bằng lại" hoặc bất cứ thứ gì tương tự. Do đó, không có gì lạ khi chính AST chứa thông tin lập chỉ mục hoặc thông tin để giúp "tìm kiếm".