Động lực: Tôi muốn có thể sử dụng lập trình chức năng đồ chơi bằng các ngôn ngữ không có chức năng đặt hàng đầu tiên, bằng cách sử dụng các số tự nhiên thay vì chức năng.Làm thế nào để viết một liệt kê của tất cả các chức năng tính toán?
Chức năng phổ quát là hàm f: N -> (N -> N), tương đương f: N * N -> N liệt kê tất cả các hàm có thể tính toán. Nói cách khác, có một số k sao cho f (k) là hàm bình phương, có một số j sao cho f (j) là hàm nguyên tố thứ n, v.v.
Để viết một hàm như vậy, ta có thể lấy bất kỳ ngôn ngữ Turing-hoàn thành (trình biên dịch ngôn ngữ lập trình, lambda calculus, Turing máy ...) và liệt kê tất cả các chương trình. Tôi muốn cho phép không chỉ đánh giá, mà còn cho phép hoạt động trên các chức năng như bổ sung, thành phần, currying. Ví dụ, cho các chỉ số của hai hàm f, g tôi muốn biết chỉ số của hàm f + g, hoặc f được tạo thành với g là gì. Điều này sẽ cho phép "lập trình đồ chơi chức năng".
Cách tốt để viết thư viện mã như vậy là gì? Tôi không tìm kiếm một tarpit Turing tối giản mà sẽ đấu tranh để tính giai thừa 10, cũng không phải tôi không muốn viết một trình biên dịch nâng cao. Nó cần phải có một số chức năng cơ bản như bổ sung và khả năng để viết vòng lặp, nhưng không nhiều hơn nữa.
Giải pháp ở tất cả các ngôn ngữ cấp cao đều được chào đón. Pseudocode, Haskell và Python được ưu tiên. Bạn có thể giả định số học chính xác tùy ý. Sử dụng eval
hoặc tương tự không được phép.
Làm rõ: Các hàm được liệt kê sẽ bao gồm tất cả các hàm partial recursive (computable) - bao gồm các hàm không dừng trên một số yếu tố đầu vào. Chức năng phổ quát sẽ treo trong trường hợp đó; tất nhiên điều này là không thể tránh khỏi. Xem thêm: các hàm đệ quy m - http://en.wikipedia.org/wiki/Μ-recursive_function.
Vì bạn dường như cần một số trợ giúp và di chuyển để chấp nhận câu trả lời. Tốt nhất là http://stackoverflow.com/questions/1797457/how-to-write-an-enumeration-of-all-computable-functions/1797575#1797575 bởi Pascal Cuoq. Người cuối cùng bởi hirschhornsalz cũng không tệ. Tôi có thể hiểu rằng bạn khó chấp nhận nó. – babou