Tôi đã viết chức năng này:Làm thế nào tôi có thể làm cho lần này chung chung hơn
{-# 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
Tôi cảm thấy như tôi đang thiếu một số trừu tượng cơ bản có thể làm cho này tổng quát hơn, và gọn gàng hơn.
Có ai có thể cho tôi một số gợi ý về cách sử dụng bất kỳ Haskellisms hiện đại nào ở đây để cải thiện điều này không?
chỉnh sửa Mã này là ở đây https://github.com/boothead/hierarchy/blob/master/src/Hierarchy.hs
và tôi đã bao gồm nhập khẩu
chỉnh sửa Có lẽ tôi có thể sử dụng ifoldr để có được gần gũi hơn với ý tưởng @ cdk không?
chỉnh sửa
Dưới đây là gần nhất tôi đã có.
--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
Đây là chữ ký loại đầu tiên (nhận xét) hoạt động. Bây giờ vấn đề nằm trong sự tồn tại x
trong chữ ký loại Fold :: (x -> a -> x) -> x -> (x -> b) -> Fold a b
Tôi không thể tìm ra những gì để đặt ở vị trí begin
của lần mới của tôi. Nó cần phải được loại f i x
nhưng tôi không biết làm thế nào để nói với Haskell làm thế nào để có x
để được cùng loại như begin
.
Tôi không thể tìm thấy kiểu chữ 'Fold' trong Hoogle. –
@SebastianRedl Đó là trong http://hackage.haskell.org/package/foldl, tôi tin rằng – ocharles
Trong nháy mắt, 'overMaps :: Có thể gập lại f => Gấp một b -> Fold (f a) (f b)' gần như có vẻ đầy hứa hẹn. Thật không may tôi nghĩ rằng 'foldrWithKey' là điểm gắn bó vì nó không phải là một phần của lớp' Có thể gập lại ' – cdk