Đây là sự hiểu biết của tôi về cách thức hoạt động.
Đây là giải thích đơn giản nhất mà tôi có thể nghĩ đến, tôi đã cố gắng (cố ý) để tránh bất kỳ khái niệm hay từ ngữ nào có thể gây nhầm lẫn.
Một khái niệm quan trọng cần lưu ý là ứng dụng một phần. Cách tôi hiểu điều này là, trong Haskell, chúng ta có thể "sửa" một trong các tham số của hàm thành một giá trị đã biết, do đó, bây giờ hàm chấp nhận một tham số ít hơn.
Tóm tắt: loại const là:
const :: a -> b -> a
Như một ví dụ đơn giản, chúng ta hãy “sửa chữa” các tham số đầu tiên là (+)
let f = const (+)
Bây giờ chúng ta đã khắc phục các tham số đầu tiên của const, “f” là một hàm chỉ chấp nhận một tham số duy nhất. Nhưng vì const luôn trả về tham số đầu tiên mà chúng ta đã sửa, có nghĩa là bất cứ điều gì chúng ta chuyển tới “f” sẽ bị bỏ qua, và nó sẽ luôn trả về hàm “+”.
Ví dụ, tất cả những điều sau đây sẽ cung cấp cho 5, vì e sẽ luôn trả lại chức năng “+” bất kể những gì nó nhận được là tham số đầu tiên, và chức năng “+” sẽ hoạt động trên 2 và 3:
f “aaa” 2 3
f 904212 2 3
f undefined 2 3
loại f là:
f :: b -> Integer -> Integer -> Integer
Lưu ý rằng “b” có thể là bất cứ điều gì, như có thể thấy ở trên.
Bây giờ cho các chức năng thực tế trong câu hỏi:
g = const id
Điều này có nghĩa rằng chúng ta “cố định” id như tham số đầu tiên, do như trên, “g” bỏ qua tham số đầu tiên của nó và trả về chức năng “id” . Trong Haskell, chúng ta có thể đi về phía trước và cung cấp các tham số thêm để “id”, giống như chúng tôi đã làm cho (+) ở trên, ví dụ như vậy tất cả trong số này sẽ quay trở lại 42:
g “aaa” 42
g undefined 42
Vì vậy, “g” được chức năng chấp nhận hai tham số, và luôn luôn trả lại một giây, vì vậy loại của nó là:
g = const id :: b -> a -> a
Nhưng chờ một phút, tôi chỉ cần thực hiện một bước nhảy vọt khổng lồ đó. Loại không phải là:
b -> (a -> a)
vì chúng tôi vừa nói rằng chúng tôi chấp nhận bất kỳ điều gì và trả về "id"?
Vâng, vâng, ngoại trừ trong Haskell những dấu ngoặc đơn đó có thể được bỏ qua.
Nó cũng có ý nghĩa vì bạn có thể cung cấp ngay chức năng “id” với tham số phụ cần thiết (như trong ví dụ “const (+)” ở trên).
Chỉ để bổ sung các câu trả lời được cung cấp, hãy nhớ rằng tất cả các hàm trong Haskell đều được curried, vì vậy 'a -> (b -> c)' giống với 'a -> b -> c' –
Có một [câu hỏi tương tự ] (http://stackoverflow.com/questions/18680341/what-is-the-purpose-of-const-id-in-this-function), nhưng nó có một câu trả lời tình huống hơn, có thể rõ ràng hơn, tùy thuộc vào quá trình suy nghĩ của bạn. – chwarr