Duplicar posible:
Making (a, a) a Functor¿Por qué (a, a) no es un funtor?
me escribió la siguiente implementación de la clasificación rápida:
import Data.List (partition)
quicksort [] = []
quicksort (x:xs) =
let (smaller, notSmaller) = partition (< x) xs
in quicksort smaller ++ x : quicksort notSmaller
luego quería para abreviar las dos llamadas recursivas a quicksort
aplicando fmap
a el par de lista:
quicksort (x:xs) =
let (smaller, notSmaller) = fmap quicksort $ partition (< x) xs
in smaller ++ x : notSmaller
Pero aparentemente, (a, a)
no es un funtor. ¿Porqué es eso? He intentado proporcionar una:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
Pero ghci no me gustaba mi intento:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
Podría alguien explicar que el error a mí? Intenté varias "correcciones", pero ninguna de ellas funcionó.
¿Es posible hacer (a, a)
una instancia de Functor
? ¿O el sistema de tipo no es lo suficientemente expresivo?
Aha, probé 'tipo Pair a = (a, a)' y eso no funcionó. – fredoverflow
@FredOverflow 'type' es simplemente similar a' typedef' en C++; no crea un tipo nuevo, solo un alias (para que no haya ninguna diferencia). – qox