gpt4 book ai didi

haskell - 选择非空的幺半群

转载 作者:行者123 更新时间:2023-12-02 07:38:41 26 4
gpt4 key购买 nike

我需要一个函数来选择一个非空的幺半群。对于列表,这将意味着以下行为:

> [1] `mor` []
[1]
> [1] `mor` [2]
[1]
> [] `mor` [2]
[2]

现在,我实际上已经实现了它,但我想知道是否存在一些标准的替代方案,因为它似乎是一种常见的情况。不幸的是,Hoogle 没有帮助。

这是我的实现:

mor :: (Eq a, Monoid a) => a -> a -> a
mor a b = if a /= mempty then a else b

最佳答案

如果您的列表最多包含一个元素,则它们同构于 Maybe,为此存在“第一个非空”幺半群:First 来自 Data.Monoid.它是 Maybe a 值的包装器,mappend 返回第一个 Just 值:

import Data.Monoid
main = do
print $ (First $ Just 'a') <> (First $ Just 'b')
print $ (First $ Just 'a') <> (First Nothing)
print $ (First Nothing) <> (First $ Just 'b')
print $ (First Nothing) <> (First Nothing :: First Char)

==> Output:
First {getFirst = Just 'a'}
First {getFirst = Just 'a'}
First {getFirst = Just 'b'}
First {getFirst = Nothing}

转换 [a] -> Maybe a 是使用 Data.Maybe.listToMaybe 实现的。

附带说明:这个不限制包装类型的类型类;在您的问题中,您需要一个 Eq 实例来比较与 mempty 是否相等。当然,这是以 Maybe 类型为代价的。

关于haskell - 选择非空的幺半群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13615469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com