phép nói rằng tôi đã có lớp:lớp generalising thông số
class C a b t where
f :: (a, b) -> (t a, t b)
Bây giờ với định nghĩa này, tôi có thể xác định các trường hợp cho tiếng nói:
(a,b) -> (Maybe a, Maybe b)
(a,b) -> ([a], [b])
Nhưng không cho (như xa như tôi hiểu):
(a,b) -> (a,b)
(a,b) -> ((a, a), (b, b))
tôi thay vì có thể thay đổi định nghĩa lớp của tôi như vậy:
type family T a b x
class C a b where
f :: (a, b) -> (T a b a, T a b b)
Điều này sẽ cho phép tôi thực hiện việc trên, nhưng sau đó tôi chỉ có thể khai báo một f
cho mỗi a
và b
.
Về cơ bản, tôi muốn có thể truyền một họ loại là t
trong định nghĩa gốc, được xác định ngầm bởi trình kiểm tra loại nếu được biết. Tôi không muốn chỉ làm cho nó f :: (a, b) -> (c, d)
như tôi muốn duy trì bất biến mà cả hai a
và b
có cùng một điều thực hiện cho họ, vì vậy swap . f
là cùng loại với f . swap
. Tôi nghĩ rằng tôi có thể cần injective type families (từ GHC 8.0) nhưng tôi không chắc chắn. Nhưng có thể có một cách khác?
Không trả lời: bạn có thể sử dụng 'Danh tính' trong trường hợp đầu tiên và một kiểu mới phù hợp trong trường hợp thứ hai (tôi không thể nghĩ ra bất kỳ chuẩn nào ngay bây giờ). Đó là một cách giải quyết thô lỗ, nhưng nó có thể chứng minh ít đau đớn hơn so với thủ thuật tiên tiến này dường như kêu gọi. Bằng cách này, "Tôi không muốn chỉ làm cho nó' f :: (a, b) -> (c, d) 'như tôi muốn duy trì bất biến ..." âm thanh rất giống với vấn đề * ống kính * ống kính là 'ống kính stab' [mặc dù bốn tham số phụ thuộc lẫn nhau] (http://comonad.com/reader/2012/mirrored-lenses) (xem phần" Tại sao nó là một gia đình ống kính? "của bài). – duplode
Tôi nghĩ rằng đây là cơ bản cùng một câu hỏi như http://stackoverflow.com/questions/4922560/why-doesnt-typesynonyminstances-allow-partially-applied-type-synonyms-to-be-use –