2016-07-24 22 views
4

Es stellt sich heraus, dass für ByteString keine Instanz von Foldable verfügbar ist. Ich möchte eine Funktion schreiben, die foldl' entweder [Word8] oder ByteString verwendet, aber ich kann nicht. Da ein ByteString ist, datenmäßig, das gleiche wie [Word8], scheint es, dass ich in der Lage sein sollte.Folding über [Word8] und ByteString mit der gleichen Funktion?

Gibt es ein Paket, das die beiden integriert oder muss ich meine eigene mit einer Typklasse rollen?

Antwort

7

ErikRs Antwort ist großartig. Ich möchte nur eine Randnotiz einfügen. Wenn Sie lens haben haben Sie die bytes Traversal:

λ> import Data.ByteString.Lens 
λ> import Control.Lens 
λ> :t foldrOf bytes 
foldrOf bytes 
    :: IsByteString s => (GHC.Word.Word8 -> r -> r) -> r -> s -> r 

In einem gewissen Sinn die Frage, die Sie gefragt werden, ist die motivation für das lens Paket: können wir die Funktionen in Data.Foldable und Data.Traversable verbrauchen nicht nur regelmäßig Instanzen Foldable erweitern und Traversable aber auch Objekte, die Verhalten und zusammensetzen wie Faltbare und Traversables?

+0

Ach, du hast mich dazu geschlagen :) –