在运行最小/最大问题时,例如到目前为止,minimum-so-far 通常被初始化为 \infty,以保证我们“捕获”每个最小值,无论它位于何处。
在 Haskell 中,我们有
minBound
和 maxBound
代表 Int
,但它们的行为并不像我们想要的那样,因为如果我们在这些边界附近“局部”进行算术运算,它们可能会下溢/溢出。对于Integer
我们什么都没有。显然我们可以使用类似 Float
的东西,但是仅仅为了利用这些无限值而使用分数类型来解决积分问题似乎有点矫枉过正。
也可以将问题转化为需要非空输入的问题,但这并不是很好,因为它通常会使案例分析变得更加复杂,而且还因为在您获取某些固定输入的运行最小值/最大值的情况下-size 窗口,您需要整个窗口的元素,而不仅仅是一个单例。
我的问题是,我们如何使用
Integer
解决运行最小/最大问题而不需要非空输入,或者这是不可能的吗?
您可以与
Maybe (Max a)
一起工作。事实上,我们可以使用它的 Monoid
实例类型[Hackage],从而折叠元素集合,因为:
ghci> Nothing <> Just (Max 12)
Just (Max {getMax = 12})
ghci> Nothing <> Just (Max 25)
Just (Max {getMax = 25})
ghci> Just (Max 14) <> Just (Max 25)
Just (Max {getMax = 25})
ghci> Just (Max 14) <> Nothing
Just (Max {getMax = 14})
ghci> Nothing <> (Nothing :: Maybe (Max Integer))
Nothing
因此,我们在这里使用
Nothing
,就像您可以使用(负)无穷大来表示(最大值)/最小值一样。
因此,我们可以将元素列表的项目包装到
Just (Max …)
中,例如:
ghci> foldMap (Just . Max) [1,4,2,5]
Just (Max {getMax = 5})
ghci> foldMap (Just . Max) []
Nothing