Haskell 哈斯克尔:更好的写作方式也许是Endo?
多亏了这个软件包,我才发现了Endo类型,我发现有必要能够将可能的值放入Endo中。因此,我编写了一个名为maybeEndo的函数。下面是一个正在使用的示例:Haskell 哈斯克尔:更好的写作方式也许是Endo?,haskell,maybe,monoids,Haskell,Maybe,Monoids,多亏了这个软件包,我才发现了Endo类型,我发现有必要能够将可能的值放入Endo中。因此,我编写了一个名为maybeEndo的函数。下面是一个正在使用的示例: setProxy :: Proxy -> RequestTransformer setProxy (Proxy pHost pPort) = Endo $ addProxy pHost pPort maybeEndo :: (a -> Endo b) -> Maybe a -> Endo b maybeEndo
setProxy :: Proxy -> RequestTransformer
setProxy (Proxy pHost pPort) = Endo $ addProxy pHost pPort
maybeEndo :: (a -> Endo b) -> Maybe a -> Endo b
maybeEndo _ Nothing = Endo id
maybeEndo f (Just v) = f v
setPotentialProxy :: Maybe Proxy -> RequestTransformer
setPotentialProxy = maybeEndo setProxy
让我印象深刻的是,这似乎应该被封装到某种类型的模式中。在我写这个问题时,我想到了一个解决方案:
maybeEndo :: (a -> Endo b) -> Maybe a -> Endo b
maybeEndo = maybe (Endo id)
这意味着setPotentialProxy可能只是:
setPotentialProxy :: Maybe Proxy -> RequestTransformer
setPotentialProxy = maybe (Endo id) setProxy
然而,我仍然决定发布这个问题,因为也许有一种更自然的方式来处理这个场景。也许它会帮助其他人。你已经找到了
也许(Endo-id)
。但是Endo
是Monoid
的一个实例,而Endo-id
是它的中性元素mempty
。所以你也可以写得更笼统一些
maybeMonoid :: Monoid b => (a -> b) -> Maybe a -> b
maybeMonoid = maybe mempty
这已经是很惯用的了(当你搜索“maybempty”
时,点击率很高)。通过使用数据中的函数,您可以更加通用。可折叠的:
foldMap :: (Foldable t, Monoid b) => (a -> b) -> t a -> b
这样,你就可以写了
setPotentialProxy :: Maybe Proxy -> RequestTransformer
setPotentialProxy = foldMap setProxy
(但请确保您保留了类型签名,否则您将在以后阅读代码时花费太多时间弄清楚它:-)。它有一个名称:foldMap!太好了,这正是我想要的。回答得很好!