2016-05-22 6 views

Antwort

6

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}.

+1

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? –

+0

Ja - das zweite Element wird als Wert betrachtet. Ich füge etwas dazu in meiner Antwort hinzu. – ErikR

2

Die kurze Antwort ist, denn es gibt keine Funktion length benannt ist, die (,,) als Eingabe verwendet.

Es gibt eine Funktion length, die eine faltbare als Eingabe: https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Foldable.html#v:length

Wenn Sie dies in GHCI Typ:

:i (,) 

Man merkt, es ist eine Instanz faltbare

(,,) 

ist keine faltbare Instanz.

+0

Ah, ich wusste nicht ': t' gab keine Informationen über Typklassen. Vielen Dank. –

7

Die Functor, Traversable und vor allem Foldable Instanzen für Paare sind etwas umstritten. Es gibt Umstände, unter denen Code kompilieren und etwas tun kann, was nicht beabsichtigt war. I proposed adding the missing functor instances for triples, etc. und, wie die folgenden Threads zeigen, hat das wirklich einen Nerv getroffen. Also warum nicht (,,) eine Foldable Instanz haben? Weil die Gemeinschaft keinen Konsens gefunden hat, dass es sollte.

+1

Danke. Interessanter Link von diesem Thread: http://bitemyapp.com/posts/2015-10-19-either-is-not-arbitrary.html –

+1

@TheUnfunCat, oh, ich weiß. Es gibt keine Frage, dass es für "Functor" und "Traversable" genau eine gesetzestreue Option gibt. Das Hauptproblem ist "faltbar", was ein bisschen "wild" ist. 'length' und' null' zum Beispiel funktionieren auf einem 'Faltbaren', unabhängig davon, ob es sich tatsächlich um den' Faltbaren' handelt oder nicht. Dies kann dazu führen, dass falscher Code kompiliert wird. – dfeuer

Verwandte Themen