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)
任何人都有他们用于此类事情的模式吗?谢谢!
你正在寻找其中一个
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)