通过动态功能列表管理数据

时间:2016-12-08 07:09:34

标签: haskell composition monoids

所以我经常发现自己像数据流一样设计'管道', 并且通常最终导致管道本身是动态的。

有没有一种简单的方法可以做这样的事情?

pipe :: [a -> a] -> a -> a

或者是否有一种不同的模式我应该用这样的东西来达成?它类似于State monad,但我不想将函数编辑为(a -> (), a)或其他:/

我意识到这是一个幺半群,所以我写了这个,这似乎是一个优雅的解决方案,它存在于某个库的某个库中吗?似乎大多数Arrow和Function Monoids都做了不同的事情。

newtype Comp a = Comp { 
      runComp :: a -> a 
}

instance Monoid (Comp a) where
  (Comp a) `mappend` (Comp b) =  Comp (b . a)
  mempty = Comp id

pipe :: [a -> a] -> a -> a
pipe = runComp . foldMap Comp

任何人都有他们用于此类事情的模式吗?谢谢!

1 个答案:

答案 0 :(得分:5)

您正在寻找其中一个

foldr (.) id        -- right-to-left

foldl (flip (.)) id -- left-to-right

取决于您希望功能组成的顺序:

ghci> foldr (.) id [(+1),(*10)] 0
1
ghci> foldl (flip (.)) id [(+1),(*10)] 0
10