Tôi đang cố gắng để tạo ra một "kế thừa" của các lớp học kiểu đại số, như sau:-nửa nhóm/monoid/Nhóm kiểu lớp thứ bậc trong các lỗi Haskell
class Semigroup a where
(.*) :: a -> a -> a
foldr1 (.*) = foldl1 (.*) -- GHCi error: "`foldr1' is not a (visible) method of class `Semigroup'"
class (Semigroup a) => Monoid a where
identity :: a
(.*) identity = id :: a -> a -- GHCi error: "`.*' is not a (visible) method of class `Monoid'"
class (Monoid a) => Group a where
inverse :: a -> a
Như vậy, nhóm này monoids và monoids là nửa nhóm. Tuy nhiên, tôi nhận được lỗi rằng các lớp học không thể nhìn thấy các chức năng của lớp cha mẹ của họ.
Các lỗi này gây lỗi cho tôi vì tôi giả định rằng bằng cách viết (ví dụ) class (Semigroup a) => Monoid a
lớp Monoid a
sẽ có thể xem hàm (.*)
. Và hơn nữa, loại foldr1
trong Prelude không có ràng buộc, vì vậy tôi giả định rằng foldr1
sẽ hoạt động trong ngữ cảnh này.
Để làm rõ, điều tôi định làm là triển khai các tiên đề cho các nhóm semigroup, monoids và nhóm dưới dạng các lớp kiểu. Do đó, lớp 'Semigroup a' phải đi kèm với một phép toán nhị phân kết hợp' (. *) :: a -> a -> a'. Tôi đã cố gắng ám chỉ sự liên kết bằng cách sử dụng 'foldr1', nhưng đây là lần thử thứ ba của tôi, được bắt đầu bởi' (x. * Y). * Z = x. * (Y. * Z) 'và' \ xyz -> (x. * y). * z = \ xyz -> x. * (y. * z) '. Sau đó, tôi muốn lớp 'Monoid a' là một lớp con của' Subgroup a', kế thừa hoạt động nhị phân '(. *)' Và hiển thị cách nó tương tác với phần tử 'identity' (tức là, tầm thường). –
Bạn đang cố gắng nêu rõ luật pháp cho '(. *)'? Bạn không thể làm điều đó trong các khai báo lớp; Tôi nghĩ rằng bạn cần phải xem xét các quy tắc viết lại để có được hiệu quả mà bạn muốn. – yatima2975
@ yatima2975 Tôi nhìn lên và tôi chưa thử, nhưng trông giống như những gì tôi đang tìm kiếm. Cảm ơn rất nhiều –