Câu hỏi này là một câu hỏi lý thuyết về các hàm Haskell có thể lấy các đối số thuộc bất kỳ loại nào. Có sự khác biệt giữa cách thức chức năng với chữ ký loại của
a -> b -> a
và
c -> a -> c
được khởi tạo? Bất kỳ trợ giúp được đánh giá cao.
Câu hỏi này là một câu hỏi lý thuyết về các hàm Haskell có thể lấy các đối số thuộc bất kỳ loại nào. Có sự khác biệt giữa cách thức chức năng với chữ ký loại của
a -> b -> a
và
c -> a -> c
được khởi tạo? Bất kỳ trợ giúp được đánh giá cao.
Câu trả lời:
Không có sự khác biệt. Kể từ khi a
, b
và c
bắt đầu với một chữ thường , đây là những biến . Bạn có thể đổi tên các biến và điều này vẫn giữ nguyên, miễn là hai (hoặc nhiều) biến không " đụng độ ".
Cuộc đụng độ như vậy có thể xảy ra nếu bạn đổi tên một biến sao cho nó có cùng tên với một biến khác hoặc khi bạn đổi tên hai (hoặc nhiều) biến thành cùng một tên mới. Nếu bạn đổi tên biến thành a
ví dụ thành b
đoạn mã đầu tiên, thì chúng ta sẽ nhận được b -> b -> b
, nhưng điều đó không giống nhau, từ đó chúng ta thực thi rằng tham số thứ nhất và thứ hai là cùng loại. Trong khi trong chữ ký loại của bạn, chúng tôi có quyền tự do chọn hai loại có thể giống nhau, nhưng điều đó là không cần thiết.
Không. Hãy nghĩ về a -> b -> a
như This Type -> Another Type -> This Type
. Sau đó cả hai phù hợp với mô hình nhất định. Tuy nhiên, một cái gì đó như a -> b -> c
không phù hợp: This Type -> That Type -> Yet Another Type
là (nói chung) khác nhau; ngoại trừ trường hợp cạnh khi c = a
, mang lại mẫu bạn quan tâm.