Warum sind Differenzlisten keine faltbare Instanz?

8

Das dlist-Paket enthält die DList -Daten Typ, der viele Instanzen hat, aber nicht Foldable oder Traversable . In meinen Augen sind dies zwei der "listenähnlichen" Klassen. Gibt es einen Leistungsgrund, dass DList keine Instanz dieser Klassen ist?

Außerdem implementiert das Paket foldr und unfoldr , aber keine der anderen Faltungsfunktionen.

    
Mike Izbicki 23.03.2013, 17:03
quelle

2 Antworten

10

DList a ist ein Wrapper vom Typ newtype für [a] -> [a] , der in einer kontravarianten Position eine a aufweist. Daher kann Foldable oder Traversable oder sogar Functor nicht direkt implementiert werden. Die einzige Möglichkeit, sie zu implementieren, ist die Konvertierung in und aus regulären Listen (siehe foldr Implementierung), was den Leistungsvorteil von Differenzlisten zunichte macht.

    
Sjoerd Visscher 23.03.2013, 17:34
quelle
16

Eine Alternative, die Sie anstelle von DList in Betracht ziehen sollten, ist die Verwendung von Church-encoded-Listen. Die Idee ist, dass Sie eine Liste als einen undurchsichtigen Wert darstellen, der weiß, wie man eine foldr über eine Liste ausführt. Dies erfordert die Verwendung der Erweiterung RankNTypes :

%Vor%

Der Nachteil ist, dass es keine effiziente tail -Operation für eine ChurchList -Faltung gibt ChurchList ist billig, aber wiederholte Schwänze zu nehmen ist teuer ...

    
Luis Casillas 23.03.2013 23:38
quelle