Jak mogę wykonać (a, a)
a Functor
bez odwoływania się do ?Tworzenie (a, a) Functor
Zasadniczo chcę go do pracy tak:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
Ale oczywiście nie jest to legalny sposób, aby to wyrazić:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
Co naprawdę chcę to funkcja typu poziom jak to: \a -> (a, a)
(nieprawidłowa składnia). A może typowy alias?
type V2 a = (a, a)
instance Functor V2 where
fmap f (x, y) = (f x, f y)
Myślę, że to zadziała, ale tak nie jest. Po pierwsze mam tego zarzutu
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'
Jeśli śledzę informacje i dodaj rozszerzenie TypeSynonymInstances
, pojawia się nowy błąd:
Type synonym `V2' should have 1 argument, but has been given 0
In the instance declaration for `Functor V2'
Dobrze, duh, że o to chodzi! V2
ma rodzaj * -> *
, co jest wymagane od instancji Functor
. No, ok, mogę użyć newtype
takiego:
newtype V2 a = V2 (a, a)
instance Functor V2 where
fmap f (V2 (x, y)) = V2 (f x, f y)
Ale teraz muszę posypać V2
s obficie w całym moim kodu zamiast po prostu będąc w stanie radzić sobie z prostymi krotek, które niby pokonuje punkt uczynienia tego Functor
; w tym momencie mogę równie dobrze spełniać swoją funkcję vmap :: (a -> b) -> (a, a) -> (b, b)
.
Czy istnieje sposób, aby to zrobić ładnie, tj. Bez numeru newtype
?
Kiedy chciałbyś, aby krotki były tak funkcjonalne? Wydaje mi się, że jeśli potrzebujesz mocy uber-Functor do operowania na krotkach specjalnych, powinieneś przede wszystkim użyć niestandardowej struktury danych, a nie krotek. Co reprezentują krotki, którymi manipulujesz? –
@Dan Nie _need_ "uber-Functor powers", to byłby umiarkowanie wygodny, wydawało się, że powinno być możliwe, a jeśli nie jest, jestem ciekawy dlaczego. –
@pelotom Zgadzam się, że wydaje się, że powinno być możliwe, choć wydaje się, że tak nie jest. Po prostu pomyślałem, że poświęcę chwilę, by sięgnąć po moją mydelniczkę i głosić dobroć tworzenia ekspresyjnej struktury dostosowanej do twojego problemu, zamiast przeciążać krotki. –