Haskell标准库中安全的最大值是什么?

9
在 Haskell 标准库中,是否有与 maximum 等效的安全函数?
*Main Control.Monad.State Data.List> maximum []
*** Exception: Prelude.maximum: empty list

我试图在hoogle上找到一个(Ord a, Foldable t) => t a -> Maybe a的函数,但没有找到。

3个回答

7
为了完整起见:如果您将“标准库”要求放宽到“一些非常常用的库”,那么 safe 包提供了 Safe.Foldable 模块,其中包括一个 maximumMay 函数。
maximumMay :: (Foldable t, Ord a) => t a -> Maybe a

6
你可以针对任何Foldable自己编写代码,通过将foldMap应用于适当选择的Monoid来完成。 Option monoid采用现有的Semigroup并通过添加一个空元素(Option Nothing)将其提升为一个Monoid,如果输入的Foldable为空,则foldMap将返回该元素。 Max newtype可以通过使<>选择其参数中的较大者来将Ord的任何实例提升为Semigroup
因此,通过将OptionMax的组合通过foldMapping输入的Foldable,我们可以获得所需的行为。
safeMaximum :: (Foldable t, Ord a) => t a -> Maybe a
safeMaximum = fmap getMax . getOption . foldMap (Option . Just . Max)

ghci> safeMaximum "wowzers"
Just 'z'
ghci> safeMaximum ""
Nothing

5
Otpion不再需要,通过编写以下代码将达到相同的结果: safeMaximum = fmap getMax . foldMap (Just . Max) - Artur Gajowy

3
你可以创建自己的:
maximumMaybe :: (Ord a, Foldable f) => f a -> Maybe a
maximumMaybe xs
  | null xs   = Nothing
  | otherwise = Just $ maximum xs

之前的回答(不可折叠):

maximumMaybe :: Ord a => [a] -> Maybe a
maximumMaybe xs = listToMaybe xs *> Just (maximum xs)

如果你喜欢点无风格,也可以这样写:

maximumMaybe :: Ord a => [a] -> Maybe a
maximumMaybe = (<*) . Just . maximum <*> listToMaybe

另一种更简单的解决方案是:

maximumMaybe :: Ord a => [a] -> Maybe a
maximumMaybe [] = Nothing
maximumMaybe xs = Just $ maximum xs

3
另一种无点方式,使用 Data.List.NonEmpty(现在在 base 中):fmap maximum . nonEmpty - David Fletcher
不错啊!:D 我需要更多地使用 NonEmpty - basile-henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接