Mögliche Duplizieren:
Making (a, a) a FunctorWarum ist (a, a) kein Funktor?
Ich schrieb die folgende Implementierung von Quicksort:
import Data.List (partition)
quicksort [] = []
quicksort (x:xs) =
let (smaller, notSmaller) = partition (< x) xs
in quicksort smaller ++ x : quicksort notSmaller
Dann habe ich durch die Anwendung fmap
, um die zwei rekursive Aufrufe zu quicksort
abkürzen wollte das Listenpaar:
quicksort (x:xs) =
let (smaller, notSmaller) = fmap quicksort $ partition (< x) xs
in smaller ++ x : notSmaller
Aber anscheinend ist (a, a)
kein Funktor. Warum das? Ich habe versucht, eine schaffen:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
Aber GHCI nicht mein Versuch nicht mochte:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
Könnte jemand diesen Fehler zu mir erklären? Ich habe verschiedene "Fixes" ausprobiert, aber keiner von ihnen hat funktioniert.
Ist es möglich, (a, a)
eine Instanz von Functor
zu machen? Oder ist das Typensystem nicht ausdrucksvoll genug?
Aha, ich versuchte 'type Pair a = (a, a)' und das hat nicht funktioniert. – fredoverflow
@FredOverflow 'type' ist ähnlich wie' typedef' in C++; Es erzeugt keinen neuen Typ, nur einen Alias (also würde es keinen Unterschied machen). – qox