이 배는 더 일반적인 만들 수 있습니다어떻게 내가이 기능을 작성했습니다
{-# 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
내가이 더 일반적으로 만들 수있는 몇 가지 근본적인 추상화없는 것 같은 느낌, 그리고 더 간결.
아무도 내게 더 나은이 현대 Haskellisms 사용할 수있는 방법에 대한 몇 가지 포인터를 줄 수 있습니까?
편집 코드는 여기 https://github.com/boothead/hierarchy/blob/master/src/Hierarchy.hs
내가 수입
편집은 아마도 내가 @ CDK의 아이디어에 가까운 얻을 ifoldr을 사용할 수를 포함 시켰습니다?
편집 여기
내가있어 가장 가까운입니다.
--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
여기서 첫 번째 (주석 처리 된) 유형 서명이 작동합니다. 이제 문제는 Fold :: (x -> a -> x) -> x -> (x -> b) -> Fold a b
의 유형 서명에 존재합니다. 내 새 배의 begin
위치에 무엇을 넣을 지 알 수 없습니다. 타입이 f i x
일 필요가 있지만, 하스켈에게 x
을 가져 오는 방법을 알려주는 방법이 begin
과 같은 타입이어야합니다.
립니다 온다. –
@SebastianRedl http://hackage.haskell.org/package/foldl에 있습니다. – ocharles
'overMaps :: Foldable f => 폴드 a b -> 폴드 (f a) (f b)'가 거의 유망 해 보입니다. 불행히도'foldrWithKey'는'Foldable' 클래스의 일부분이 아니기 때문에 붙는 부분이라고 생각합니다. – cdk