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

Chr*_*ner 2 haskell composition monoids

因此,我经常发现自己设计的"管道"就像数据流一样,并且通常最终导致管道本身是动态的.

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

pipe :: [a -> a] -> a -> a
Run Code Online (Sandbox Code Playgroud)

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

我意识到这是一个幺半群,所以我写了这个,这似乎是一个优雅的解决方案,它存在于某个库的某个库中吗?似乎大多数箭头和函数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
Run Code Online (Sandbox Code Playgroud)

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

Cir*_*dec 5

你正在寻找其中一个

foldr (.) id        -- right-to-left
Run Code Online (Sandbox Code Playgroud)

要么

foldl (flip (.)) id -- left-to-right
Run Code Online (Sandbox Code Playgroud)

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

ghci> foldr (.) id [(+1),(*10)] 0
1
ghci> foldl (flip (.)) id [(+1),(*10)] 0
10
Run Code Online (Sandbox Code Playgroud)

  • 或者,如果你想留在`Monoid`的模糊领域:`appEndo.foldMap Endo`和`(appEndo.getDual).foldMap(Dual.Endo)`.顺便说一句,我希望你不介意这个例子. (2认同)
  • 我通常使用`foldr(.)id` - 有什么理由在这里使用`foldl`吗? (2认同)