Trong khi nó là thể làm quá tải như vậy trong Haskell, nó không được coi là thành ngữ, và có khả năng sẽ dẫn đến sai sót khó hiểu sau này. Thay vào đó, bạn chỉ cần xác định chức năng xây dựng dữ liệu:
point :: Rectangle
point = Rectangle 0 0
line :: Length -> Rectangle
line l = Rectangle l 0
square :: Int -> Rectangle
square a = Rectangle a a
này cho phép bạn để cung cấp cho tên rõ ràng là mô tả ngữ nghĩa của mỗi quá tải, chứ không phải dựa vào số lượng và loại của các đối số cho disambiguate mà bạn nghĩa là.
Tuy nhiên, nếu bạn muốn viết phiên bản quá tải, bạn có thể làm điều đó một cách dễ dàng với typeclasses:
class MakeRectangle a where
rectangle :: a
instance MakeRectangle Rectangle where
rectangle = Rectangle 0 0
instance MakeRectangle (Length -> Rectangle) where
rectangle l = Rectangle l 0
instance MakeRectangle (Length -> Width -> Rectangle) where
rectangle = Rectangle
Bạn sẽ cần {-# LANGUAGE FlexibleInstances #-}
ở phía trên cùng của tập tin của bạn để biên dịch này. Một thủ thuật như thế này được sử dụng bởi thư viện tiêu chuẩn Text.Printf
, nhưng tôi sẽ không coi đây là một ví dụ điển hình về quá tải trong Haskell; hầu như luôn có một số cấu trúc cho kiểu giá trị quá tải, trong khi ở đây toàn bộ cấu trúc của nó được quyết định bởi cá thể, có thể nhận được theo cách suy luận kiểu; không chỉ vậy, nhưng không có bất kỳ luật hợp lý nào chi phối các trường hợp (thực sự, loại này quá chung chung để cho phép bất kỳ).
Nhưng nếu bạn thực sự muốn làm điều đó, bạn có thể, và đôi khi nó thường là một ý tưởng tồi, đôi khi (như trong trường hợp printf
) đó là cách duy nhất để thực hiện giao diện bạn muốn.
Để thử này ra trong GHCi, bạn sẽ cần phải xác định loại bạn đang sử dụng một cách rõ ràng, hoặc nó sẽ không thể giải quyết các trường hợp:
GHCi> rectangle :: Rectangle
Rectangle 0 0
GHCi> rectangle (1 :: Length) :: Rectangle
Rectangle 1 0
GHCi> rectangle (1 :: Length) (2 :: Width) :: Rectangle
Rectangle 1 2
Tôi sẽ không bận tâm cố gắng mô hình haskell sau C++; nó sẽ chỉ dẫn đến rất nhiều đau đớn. Ngoài ra, tại sao nhà xây dựng hình chữ nhật thứ hai của bạn là một dòng? Tôi nghĩ rằng một thực hiện hợp lý hơn sẽ được mặc định để (1, 1), và nếu bạn nhận được một int, vượt qua trong (x, x), để tạo thành một hình vuông. – alternative
Bao giờ nghe nói về danh sách khởi tạo constructor? –
@VladLazarenko: Đã bao giờ nghe nói về những người vẫn đang học? (Gợi ý: Bạn là một trong số họ, tất cả mọi người là) –