Câu hỏi này có một tinh tế "không nhưng có" loại câu trả lời, mà đòi hỏi phải đi sâu vào ba khái niệm:
- tên Qualified vs tên không đủ tiêu chuẩn
- Modules và nhập khẩu
- Aliasing
Điểm 1: mọi định nghĩa trong Haskell đều có tên ngắn, không đủ tiêu chuẩn như map
và tên dài, đủ điều kiện như Data.List.map
.
Điểm 2: khi bạn nhập mô-đun vào mô-đun khác, bạn có thể thực hiện nhập đủ điều kiện hoặc không đủ tiêu chuẩn. Khi bạn sử dụng nhập không đủ tiêu chuẩn, tên của mô-đun nước ngoài mà bạn mang vào sẽ được đặt bí danh dưới tên ngắn của chúng. Khi bạn làm một nhập khẩu đủ điều kiện, họ sẽ chỉ có sẵn dưới một cái tên được sửa đổi:
import qualified Data.Map as Map
Bây giờ trong module, nơi này xuất hiện, các Data.Map.map
chức năng có thể nhìn thấy dưới bí danh Data.map
.
Điểm thứ ba: điều này có nghĩa là mọi định nghĩa Haskell đều có tên đủ điều kiện được xác định bằng tên ngắn và mô-đun được xác định, nhưng cũng không đủ điều kiện hoặc một phần bí danh đủ điều kiện trong mỗi mô-đun được nhập.
Bây giờ, câu hỏi của bạn có hai câu trả lời:
- Hai lớp học khác nhau không có thể có phương pháp mà chia sẻ cùng một đầy đủ tên. Vì vậy, nếu bạn xác định các lớp học
Foo
và Bar
trong cùng một mô-đun, điều đó sẽ không thành công.
- Hai lớp khác nhau có thể có các phương thức có cùng tên không đủ điều kiện, miễn là tên đủ điều kiện của chúng khác nhau - tức là chúng được xác định trong các mô-đun khác nhau. Tuy nhiên, để sử dụng cả hai trong một mô-đun máy khách, bạn sẽ cần ít nhất một lần nhập đủ điều kiện để các bí danh từ quá trình nhập không xung đột.
Nguồn
2015-09-14 20:07:51
Trong OOP, các phương thức cùng tên được cho phép vì loại đối tượng 'this' này có thể phân biệt giữa chúng. Trong Haskell, không có 'này' xung quanh: các phương thức cho' Foo a' không ngầm lấy một đối số 'a'. Ngay cả khi họ đã làm, loại suy luận sẽ trở nên khá phức tạp, vì bạn cần phải tính toán loại 'this' _before_ bạn có thể biết loại phương thức. Trong hầu hết các ngôn ngữ OOP, không có hoặc ít suy luận kiểu w.r.t. ngôn ngữ chức năng, vì vậy đây không phải là vấn đề ở đó. – chi
Ngoài ra, đây là những hàm không phải là phương thức, chính xác. –
@Erik Alik: Trên thực tế, mặc dù nó rất khác với khái niệm OO, [từ 'phương pháp' về mặt kỹ thuật là đúng] (https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-750004.3) . –