2015-08-08 4 views
7

Neuer Haskell-Programmierer wird bald genug zu Quellen gehen, um zu sehen, wie foldr implementiert wird. Nun, der Code war einfach (erwarte nicht, dass Neulinge etwas über OldList oder FTP wissen).Erklären Sie, wie der neue Folder in Haskell funktioniert

Wie funktioniert der neue Code?

-- | Map each element of the structure to a monoid, 
-- and combine the results. 
foldMap :: Monoid m => (a -> m) -> t a -> m 
foldMap f = foldr (mappend . f) mempty 

-- | Right-associative fold of a structure. 
-- 
-- @'foldr' f z = 'Prelude.foldr' f z . 'toList'@ 
foldr :: (a -> b -> b) -> b -> t a -> b 
foldr f z t = appEndo (foldMap (Endo #. f) t) z 
+0

Wahrscheinlich kein Duplikat, aber [Ich schrieb eine Antwort auf immer 'foldr' von' foldMap' vor einer Weile] (http://stackoverflow.com/a/23319967/2751851). Die Antwort setzt die grundsätzliche Vertrautheit mit "Monoid" voraus, also sagen Sie uns bitte, ob es zu viele Dinge als selbstverständlich betrachtet. – duplode

Antwort

10

Ich werde nur die Teile erwähnen, dass nicht in the answer @duplode linked sind.

Zuerst sind diese Implementierungen, die Sie auflisten, Standard Methoden. Jeder Foldable Typ braucht seine eigene spezifische Version von mindestens ein von ihnen zur Verfügung zu stellen, und Listen ([]) bieten foldr, which is implemented ziemlich viel, wie es immer war:

foldr k z = go 
      where 
      go []  = z 
      go (y:ys) = y `k` go ys 

(Was ist, für Effizienz, ein bisschen anders aus der Haskell Report-Version.)

auch eine geringfügige Änderung in dem Foldable Standard seit Antwort des duplode ist, dass seltsamer #. Operator, Data.Foldable Code intern in GHC Jahren verwendet. Es ist im Grunde eine effizientere Version von ., die funktioniert nur, wenn die linke Funktion eine Wrapper/Unwrapper-Funktion des neuen Typs ist. Es definiert den neuen newtype Zwang Mechanismus verwenden, und wird in im Wesentlichen nichts optimiert:

(#.) :: Coercible b c => (b -> c) -> (a -> b) -> (a -> c) 
(#.) _f = coerce 
{-# INLINE (#.) #-} 
Verwandte Themen