ich diese Funktion geschrieben haben:Wie kann ich diese Falte allgemeinere
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module Hierarchy where
import Control.Applicative
import qualified Control.Foldl as CF
import Control.Foldl (Fold(..))
import Control.Lens hiding (Fold)
import qualified Data.Foldable as F
import qualified Data.Map.Lazy as M
import Data.Monoid (Monoid (..), Sum (Sum))
import Data.Profunctor
import Data.Set (Set)
import Data.Maybe
import Data.Text (Text)
overMaps :: (Ord k) => Fold a b -> Fold (M.Map k a) (M.Map k b)
overMaps (Fold step begin done) = Fold step' M.empty (fmap done)
where
step' acc m = M.foldrWithKey insert acc m
insert k el acc = M.insert k (step (fromMaybe begin $ M.lookup k acc) el) acc
Ich fühle mich wie ich einige grundlegende Abstraktion bin fehlt, die diese allgemeinere und prägnanter machen könnte.
Kann mir jemand Hinweise geben, wie ich hier irgendeinen modernen Haskellismus einsetzen könnte, um das besser zu machen?
bearbeiten Der Code ist hier https://github.com/boothead/hierarchy/blob/master/src/Hierarchy.hs
und ich habe die Importe
bearbeiten Vielleicht kann ich ifoldr enthalten verwenden, näher zu kommen, um @ cdk Idee?
bearbeiten
Hier ist die nächste, die ich habe.
--overFoldable :: (Ord k) => Fold a b -> Fold (M.Map k a) (M.Map k b)
overFoldable :: (Ord i, At (f i a), FoldableWithIndex i (f i), Monoid (f i x))
=> Fold a b -> Fold (f i a) (f i b)
overFoldable (Fold step begin done) = Fold step' mempty (fmap done)
where
step' acc m = Lens.ifoldr insert acc m
insert k el acc = Lens.at k %~ return . flip step el . fromMaybe begin $ acc
Hier funktioniert die erste (kommentierte) Signatur. Jetzt liegt das Problem in der existentiellen x
in der Typ-Signatur von Fold :: (x -> a -> x) -> x -> (x -> b) -> Fold a b
Ich kann nicht herausfinden, was in die begin
Position meiner neuen Falte zu setzen. Es muss vom Typ f i x
sein, aber ich weiß nicht, wie man Haskell sagt, wie man x
als den gleichen Typ wie begin
nimmt.
ich kein 'typeclass Fold' in Hoogle finden. –
@SebastianRedl Es ist in http://hackage.haskell.org/package/foldl, glaube ich – ocharles
Auf einen Blick, 'OverMaps :: Faltbare f => Falten a b -> Falten (f a) (f b)' sieht fast vielversprechend aus. Leider denke ich, dass 'foldrWithKey' der Knackpunkt ist, da es nicht Teil der' Foldable' Klasse ist. – cdk