मैं इस समारोह में लिखा है बना सकते हैं:मैं इस गुना अधिक सामान्य
{-# 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
मुझे लगता है कि मैं कुछ बुनियादी अमूर्त है कि इस अधिक सामान्य बना सकता है याद कर रहा हूँ, और अधिक संक्षिप्त।
क्या कोई मुझे कुछ पॉइंटर्स दे सकता है कि मैं इसे बेहतर बनाने के लिए यहां किसी भी आधुनिक हास्केलिज़्म का उपयोग कैसे कर सकता हूं?
संपादित कोड यहाँ है https://github.com/boothead/hierarchy/blob/master/src/Hierarchy.hs
और मैं आयात
संपादित शायद मैं ifoldr उपयोग कर सकते हैं @ CDK के विचार के साथ नज़दीकी बढ़ाने को शामिल किया है?
संपादित
यहाँ निकटतम मुझे मिल गया है है।
--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
यहां पहला (टिप्पणी) प्रकार हस्ताक्षर कार्य करता है। अब समस्या के प्रकार हस्ताक्षर में अस्तित्व x
में निहित है, मैं यह नहीं समझ सकता कि begin
में मेरे नए गुना की स्थिति क्या है। इसे f i x
टाइप करने की आवश्यकता है, लेकिन मुझे नहीं पता कि हास्केल को x
को begin
के समान प्रकार के रूप में कैसे लेना है।
है मैं एक typeclass 'Hoogle में Fold' नहीं मिल सकता है जब सूचियों की एक सूची से अधिक तह, जैसे ही: लेकिन यह अलग परिणाम देता है। –
@ सेबेस्टियन रेडल यह http://hackage.haskell.org/package/foldl में है, मुझे विश्वास है कि – ocharles
एक नज़र में, 'ओवरमैप्स :: Foldable f => एक बी -> मोड़ (एफ ए) (एफ बी)' लगभग वादा करता है। दुर्भाग्यवश मुझे लगता है कि 'फ़ोल्डविथकी' चिपकने वाला बिंदु है क्योंकि यह 'फोल्डबल' वर्ग – cdk