Có phải thứ tự bình thường của người Viking và người được gọi bằng tên khác có giống nhau không?


9

Tôi đang nghiên cứu cuốn sách Cấu trúc và diễn giải các chương trình máy tính và trong phần 1.1.5 Mô hình thay thế cho ứng dụng thủ tục , tác giả giải thích các khái niệm về trật tự thông thườngtrật tự ứng dụng , mà tôi tin rằng tôi đã hiểu rõ.

Bây giờ, tôi đang tham gia một khóa học về Coursera có tên Nguyên tắc lập trình chức năng ở Scala và ở đó, giáo sư Martin Oderky (người đã dựa vào phần lớn khóa học của mình trong cuốn sách được trích dẫn ở trên) giải thích các khái niệm tương tự dưới tên của tên gọitên gọi- theo giá trị .

Trong khóa học của mình, giáo sư Oderky nói rằng mô hình thay thế dựa trên Công cụ tính toán Lambda, vì vậy tôi đã tham khảo một cuốn sách trên thư viện của mình Giới thiệu về lập trình chức năng Mặc dù Lambda Tính và trong trang 22, tác giả đã định nghĩa các thuật ngữ là thứ tự áp dụng và thứ tự thông thường . Thật thú vị trong định nghĩa của mình, ông nói rằng thứ tự áp dụng giống như cách gọi theo giá trị của Pascal trong khi thứ tự bình thường giống như cách gọi bằng tên của Algol.

Việc sử dụng các từ "giống như" trong lời giải thích của anh ấy là điều khiến tôi nghi ngờ. Vì vậy, câu hỏi của tôi:

  • Là hai thuật ngữ tương đương hoặc có bất kỳ sự khác biệt tinh tế?
  • Tôi có thể sử dụng cái này hay cái kia thay thế cho nhau mà không mạo hiểm mắc lỗi theo nghĩa mà chúng truyền đạt không?
  • Có bất kỳ lý do bạn biết về điều đó biện minh cho sự tồn tại của các thuật ngữ khác nhau để đề cập đến cùng một điều?

1
Bài viết trên Wikipedia này nói rằng, trái ngược với thứ tự thông thường, "chiến lược gọi tên không đánh giá bên trong cơ thể của một chức năng chưa được áp dụng". Không có trích dẫn cụ thể được đưa ra mặc dù.
chrisaycock

4
Chỉ để tham khảo, bạn có biết rằng Martin Oderky là nhà thiết kế chính của Scala, phải không?
KChaloux

Câu trả lời:


7

Đánh giá đơn hàng bình thường và đánh giá cuộc gọi theo tên không hoàn toàn giống nhau. Trong đánh giá thứ tự thông thường, hàm ngoài cùng được đánh giá trước bất kỳ đối số nào của nó và các đối số đó chỉ được ước tính nếu cần. Trong đánh giá cuộc gọi theo tên, các đối số được sao chép một cách hiệu quả vào phần thân của hàm ngoài cùng và sau đó hàm đó được ước tính. Trong cả hai trường hợp, hàm ngoài cùng được đánh giá về mặt kỹ thuật trước các đối số, nhưng trong tên gọi thuần túy, các đối số được đánh giá mỗi khi chúng được sử dụng (bằng 0, một hoặc nhiều lần). Theo thứ tự thông thường, các đối số chức năng được đánh giá ít nhất chỉ khi cần lần đầu tiên (thường là 0 hoặc một lần).

Do đó, việc đánh giá đơn hàng bình thường sẽ mở ra khả năng ghi nhớ các đối số dưới dạng tối ưu hóa (đôi khi được gọi là theo nhu cầu), trong khi gọi theo tên thì không. Do đó, người ta có thể nói rằng đánh giá theo tên là một trường hợp đặc biệt của đánh giá đơn hàng bình thường. Nói cách khác, đánh giá đơn hàng bình thường đề cập đến cách tiếp cận chung của việc đánh giá một hàm trước các đối số của nó, trong khi đánh giá theo tên gọi đề cập đến một kỹ thuật cụ thể để thực hiện đánh giá đơn hàng bình thường.

Ví dụ, cho f(x, y) = sqrt(x*x + y*y)chúng ta có thể có hai cách thực hiện f(a+b, c+d)với đánh giá đơn hàng bình thường:

Ghi nhớ:

t1 = a+b;
t2 = c+d;
return sqrt(t1*t1 + t2*t2);

Gọi bằng tên:

return sqrt((a+b)*(a+b) + (c+d)*(c+d));

Như bạn có thể thấy, nếu cuộc gọi đến f bao gồm các lệnh gọi hàm khác (tức là f(random(1,100), ask_user_for_value())), hai cuộc gọi sẽ có hành vi rất khác nhau. Phiên bản ghi nhớ sẽ bình phương một số ngẫu nhiên duy nhất và yêu cầu người dùng chỉ nhận một giá trị một lần, trong khi phiên bản gọi theo tên sẽ nhân hai số ngẫu nhiên và yêu cầu người dùng cho một giá trị hai lần.

Để tìm hiểu thêm về các khái niệm này, tôi khuyên bạn nên đọc trang Wikipedia chiến lược đánh giá/cs/7702/applicative-order-and-n normal-order-in-lambda-calculus .


Cảm ơn, @edalorzo. Nếu bạn thấy nó có giá trị, xin vui lòng xem xét chấp nhận nó. :)
Randall Cook
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.