bu kat daha genel yapabilir:nasıl bu fonksiyonu yazdım
{-# 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
Ben bu daha genel yapabilir bazı temel soyutlama kaçırıyorum gibi hissediyorum ve daha özlü.
kimse Bunu düzeltmek için buraya herhangi bir modern Haskellisms kullanabilirsiniz nasıl olarak bana biraz öğüt verebilir misiniz?
düzenlemek kod burada https://github.com/boothead/hierarchy/blob/master/src/Hierarchy.hs
ve ben ithalatı
düzenlemek Belki @ cdk- fikri yaklaşmak için ifoldr kullanabilir yer verdik?
düzenlemek İşte
bende en yakın bulunuyor.
--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
İlk (yorum yazdığınız) imza işlerini burada işler. Şimdi problem benim yeni kıvrımın begin
pozisyonunda koymak için anlamaya olamaz Fold :: (x -> a -> x) -> x -> (x -> b) -> Fold a b
tipi imzası varoluşsal x
yatıyor. Bu Tip f i x
olması gerekiyor ama begin
aynı tip olması x
almaya nasıl Haskell nasıl söyleyeceğimi bilemiyorum.
kesildi geldiği gibi. –
@SebastianRedl http://hackage.haskell.org/package/foldl adresinde, – ocharles
'a inanıyorum. Bir bakışta 'overMaps :: Katlanabilir f => Fold a b -> Fold (f a) (f b)' neredeyse ümit verici görünüyor. Ne yazık ki ben 'katlanabilir 'sınıfı' Katlanabilir 'sınıf – cdk