Các hàm bậc cao hơn có cung cấp nhiều năng lượng hơn cho lập trình hàm không?


13

Tôi đã hỏi một câu hỏi tương tự trên cstheory.SE .

Theo câu trả lời này trên Stackoverflow có một thuật toán trên một ngôn ngữ lập trình chức năng thuần túy phi lười biếng có phức tạp, trong khi cùng một thuật toán trong lập trình bắt buộc là Ω ( n ) . Thêm lazyness với ngôn ngữ FP sẽ làm cho thuật toán Ω ( n ) .Ω(nđăng nhậpn)Ω(n)Ω(n)

Có bất kỳ mối quan hệ tương đương so sánh một ngôn ngữ FP có và không có Hàm bậc cao hơn không? Nó vẫn còn Turing Complete? Nếu đúng như vậy, việc thiếu Thứ tự cao hơn trên FP có khiến ngôn ngữ trở nên "mạnh mẽ" hay hiệu quả hơn không?


ngôn ngữ FP?
rebierpost

Các hàm bậc cao hơn và đánh giá lười biếng không giống nhau, afaik. Vậy câu hỏi của bạn là gì?
Raphael

Câu trả lời:


11

Trong một ngôn ngữ lập trình chức năng đủ mạnh (ví dụ, với các kiểu dữ liệu để thực hiện các bao đóng ), bạn có thể loại bỏ tất cả các cách sử dụng bậc cao hơn bằng cách chuyển đổi hàm khử . Vì phương pháp này được sử dụng để biên dịch loại ngôn ngữ này, nên bạn có thể giả định một cách hợp lý rằng điều này không ảnh hưởng đến hiệu suất và trong cài đặt này, thứ tự cao hơn không làm cho ngôn ngữ trở nên kém mạnh mẽ hơn. Tuy nhiên, nó ảnh hưởng đến cách viết mã.

Tuy nhiên, nếu ngôn ngữ không đủ mạnh, thì có, thứ tự cao hơn sẽ cung cấp sức mạnh biểu cảm. Hãy xem xét phép tính lambda: không có bất kỳ hàm bậc cao nào, nó thực sự không thể làm gì được, chủ yếu là vì các kiểu dữ liệu cơ bản nhất (số nguyên, booleans) được triển khai bằng các hàm.

Tóm lại, nó thực sự phụ thuộc vào ngôn ngữ.


Trên đây là câu trả lời của tôi. Dưới đây, một nhận xét về một giả định thông thường về các ngôn ngữ bắt buộc.

về một thuật toán trên một ngôn ngữ lập trình chức năng không lười biếng có phức tạp, trong khi cùng một thuật toán trong lập trình bắt buộc là Ω ( n ) . Thêm lazyness với ngôn ngữ FP sẽ làm cho thuật toán Ω ( n ) .Ω(nđăng nhậpn)Ω(n)Ω(n)

Tôi muốn xem tài liệu tham khảo này. Giả định thông thường là việc truy cập vào một mảng có độ dài trong RAM nằm trong thời gian O ( 1 ) và tương đương trong FP thuần túy là trong thời gian O ( log n ) . Điều đó không hoàn toàn đúng: thời gian truy cập trong RAM nằm ở O ( log m ) trong đó m là kích thước của bộ nhớ. Tất nhiên, m n . Trong thực tế truy cập một phần tử của một mảng nhanh hơn nhiều. Một lý do sẽ là m bị ràng buộc nhưng ... n cũng vậy !nÔi(1)Ôi(đăng nhậpn)Ôi(đăng nhậpm)mmnmn

EDIT: cảm ơn bạn đã liên kết (liên kết cho bài viết về sự lười biếng không có sẵn, đây là một liên kết khác ). Như đã đăng trong các bình luận và ở trên trong câu trả lời của tôi, mô hình RAM hơi không công bằng đối với FP thuần túy bằng cách cung cấp các tra cứu thời gian ngay cả khi kích thước của một địa chỉ không bị giới hạn. Tôi vẫn chưa hiểu làm thế nào trò lừa bịp hoạt động nhưng tôi nghĩ điều quan trọng cần lưu ý là điều này chỉ dành cho vấn đề đặc biệt này.Ôi(1)


4

Nó phụ thuộc vào những gì bạn có nghĩa là bằng biểu cảm.

Đây là một lập luận rằng thứ tự cao hơn sẽ thêm một cái gì đó: với các ngôn ngữ bậc nhất, đệ quy nguyên thủy là không đủ để diễn tả hàm Ackermann . Tuy nhiên, với sự có mặt của các hàm bậc cao hơn, đệ quy nguyên thủy là đủ:

Ackermann 0= =λx.x+1Ackermann (m+1)= =Lặp lại (Ackermann m)Lặp lại f 0= =f 1Lặp lại f (n+1)= =f (Lặp lại f n)

Điều này xác định hàm Ackermann chỉ sử dụng đệ quy nguyên thủy.

Lặp lạiLặp lạiNkNkLặp lại(NN)(NN)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.