¿Cómo puedo hacer (a, a)
a Functor
sin recurrir a un newtype
?Fabricación (a, a) a Functor
Básicamente quiero que funcione de esta manera:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
Pero por supuesto que no es una forma legal de expresarlo:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
Lo que realmente quiero es una función de nivel tipo como esto: \a -> (a, a)
(sintaxis inválida). Entonces, ¿un tipo de alias, tal vez?
type V2 a = (a, a)
instance Functor V2 where
fmap f (x, y) = (f x, f y)
Creo que esto funcionaría, pero no es así. En primer lugar consigo esta queja:
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'
Si sigo el consejo y añadir la extensión TypeSynonymInstances
, aparece un nuevo error:
Type synonym `V2' should have 1 argument, but has been given 0
In the instance declaration for `Functor V2'
Bueno, duh, ese es el punto! V2
tiene kind * -> *
que es lo que se requiere de una instancia Functor
. Pues bien, puedo utilizar un newtype
así:
newtype V2 a = V2 (a, a)
instance Functor V2 where
fmap f (V2 (x, y)) = V2 (f x, f y)
Pero ahora tengo que espolvorear V2
s liberalmente a través de mi código en lugar de sólo ser capaz de hacer frente a las tuplas simples, que tipo de derrotas el punto de hacerlo un Functor
; en ese punto, también podría hacer mi propia función vmap :: (a -> b) -> (a, a) -> (b, b)
.
¿Hay alguna forma de hacerlo bien, es decir, sin newtype
?
¿Cuándo le gustaría hacer tuplas a Functor como este? Me parece que, si necesita poderes de súper Funcionador para operar en tuplas de casos especiales, en primer lugar debería usar una estructura de datos personalizada, en lugar de tuplas. ¿Qué representan las tuplas que estás manipulando? –
@Dan no necesito _ "poderes de uber-Functor", hubiera sido ligeramente conveniente, parecía que debería ser posible, y si no es así, tengo curiosidad por saber por qué. –
@pelotom Estoy de acuerdo en que parece que debería ser posible, aunque parece que no lo es. Solo pensé que me tomaría un momento para subirme a mi tribuna y predicar la bondad de hacer una estructura expresiva adaptada a su problema, en lugar de sobrecargar las tuplas. –