Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔:更好的写作方式也许是Endo?_Haskell_Maybe_Monoids - Fatal编程技术网

Haskell 哈斯克尔:更好的写作方式也许是Endo?

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

多亏了这个软件包,我才发现了Endo类型,我发现有必要能够将可能的值放入Endo中。因此,我编写了一个名为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!太好了,这正是我想要的。回答得很好!