Dies ist eine Konsequenz des Vorschlags FTP (Foldable-Traversable in Prelude).
Damit length
ist jetzt etwas definiert, das faltbar ist, und es stellt sich heraus, ein faltbares Beispiel für Paare ist:
ghci> :i (,)
data (,) a b = (,) a b -- Defined in ‘GHC.Tuple’
...
instance Monoid a => Applicative ((,) a) -- Defined in ‘GHC.Base’
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
instance Traversable ((,) a) -- Defined in ‘Data.Traversable’
...
length (a,b)
wird immer wieder zurückkehren 1.
Es gibt keine faltbare ist Instanz für Tupel höherer Ordnung definiert. Zum Beispiel, wenn Sie die Klassen für Tripel definiert überprüfen:
ghci> :i (,,)
data (,,) a b c = (,,) a b c -- Defined in ‘GHC.Tuple’
instance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c)
instance (Eq a, Eq b, Eq c) => Eq (a, b, c)
instance (Ord a, Ord b, Ord c) => Ord (a, b, c)
instance (Read a, Read b, Read c) => Read (a, b, c)
instance (Show a, Show b, Show c) => Show (a, b, c)
instance (Monoid a, Monoid b, Monoid c) => Monoid (a, b, c)
Sie nicht über eine faltbare oder Travers Beispiel sehen, und das ist, warum length
nicht für diese Werte definiert ist.
aktualisieren
So (a,b)
gilt als b
ein Behälter der einzelnen Wert sein.
Sie können dies sehen, indem die Ausgabe dieses Codes beobachtet:
import Data.Foldable (fold)
import Data.Monod
foo :: Sum Int
foo = fold (3,4) :: Sum Int
Auswertung foo
kehrt Sum {getSum = 4}
.
Und wenn ich richtig verstehe, ist die Länge eins, weil das erste Element in dem Paar als Teil der Struktur des faltbaren in irgendeiner Weise betrachtet wird, so dass es wirklich nur ein Element hat, nämlich das letzte? –
Ja - das zweite Element wird als Wert betrachtet. Ich füge etwas dazu in meiner Antwort hinzu. – ErikR