Tôi làm cách nào để tạo (a, a)
một Functor
mà không cần sử dụng số newtype
?Làm (a, a) a Functor
Về cơ bản tôi muốn nó hoạt động như thế này:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
Nhưng tất nhiên đó không phải là một cách hợp pháp để thể hiện nó:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
Những gì tôi thực sự muốn là một chức năng loại cấp như điều này: \a -> (a, a)
(cú pháp không hợp lệ). Vì vậy, một bí danh loại, có lẽ?
type V2 a = (a, a)
instance Functor V2 where
fmap f (x, y) = (f x, f y)
Tôi nghĩ điều này sẽ hiệu quả nhưng không. Đầu tiên tôi nhận được đơn khiếu nại này:
Illegal instance declaration for `Functor V2'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Functor V2'
Nếu tôi làm theo những lời khuyên và thêm phần mở rộng TypeSynonymInstances
, tôi nhận được một lỗi mới:
Type synonym `V2' should have 1 argument, but has been given 0
In the instance declaration for `Functor V2'
Vâng, duh, đó là điểm! V2
có loại * -> *
là yêu cầu bắt buộc đối với phiên bản Functor
. Vâng, ok, tôi có thể sử dụng một newtype
như thế này:
newtype V2 a = V2 (a, a)
instance Functor V2 where
fmap f (V2 (x, y)) = V2 (f x, f y)
Nhưng bây giờ tôi đã có rắc V2
s tự do khắp mã của tôi thay vì chỉ có khả năng đối phó với các bộ đơn giản, trong đó loại đánh bại điểm làm cho nó một Functor
; tại thời điểm đó tôi cũng có thể làm cho chức năng của riêng tôi vmap :: (a -> b) -> (a, a) -> (b, b)
.
Vì vậy, có cách nào để làm điều này độc đáo, tức là không có newtype
?
Khi nào bạn muốn tạo bộ dữ liệu cho hàm Functor như thế này? Dường như với tôi rằng nếu bạn cần quyền hạn uber-Functor để hoạt động trên các bộ trường hợp đặc biệt, có lẽ bạn nên sử dụng một cấu trúc dữ liệu tùy chỉnh, chứ không phải là bộ dữ liệu, ngay từ đầu. Các bộ tuples bạn đang thao tác đại diện cho những gì? –
@ Tôi có thể không _need_ "quyền hạn uber-Functor", nó sẽ chỉ nhẹ nhàng thuận tiện, có vẻ như nó sẽ là có thể, và nếu nó không phải là tôi tò mò tại sao. –
@pelotom Tôi đồng ý rằng có vẻ như nó sẽ là có thể, mặc dù nó xuất hiện rằng nó không phải là. Tôi chỉ nghĩ rằng tôi sẽ mất một chút thời gian để có được trên soapbox của tôi và rao giảng sự tốt lành của việc làm cho một cấu trúc biểu cảm phù hợp với vấn đề của bạn, chứ không phải là quá tải tuples. –