Haskell的标准库中是否有maximum
的安全等价物?
*Main Control.Monad.State Data.List> maximum []
*** Exception: Prelude.maximum: empty list
我试图找到一个(Ord a, Foldable t) => t a -> Maybe a
hoogle,但没找到。
答案 0 :(得分:6)
为了完整起见:将“标准库”要求放宽到“一些非常常用的库”,安全包提供了Safe.Foldable
module,其中包含maximumMay
功能:
maximumMay :: (Foldable t, Ord a) => t a -> Maybe a
答案 1 :(得分: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
答案 2 :(得分:3)
通过将Foldable
应用于合适的foldMap
选项,您可以轻松为自己Monoid
编写一个代码。
The Option
monoid获取现有Semigroup
并通过毗邻空元素Monoid
将其提升为Option Nothing
,foldMap
将返回该元素如果输入Foldable
为空。 Ord
Semigroup
将<>
的任何实例提升为foldMap
,让Foldable
选择更大的参数。
通过Option
通过Max
和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
的组合对输入def SetThumbSize(self, width, height, border=6):
"""
Sets the thumbnail size as width, height and border.
:param `width`: the desired thumbnail width;
:param `height`: the desired thumbnail height;
:param `border`: the spacing between thumbnails.
"""
if width > 350 or height > 280:
return
self._tWidth = width
self._tHeight = height
self._tBorder = border
self.SetScrollRate((self._tWidth + self._tBorder)/4,
(self._tHeight + self._tBorder)/4)
self.SetSizeHints(self._tWidth + self._tBorder*2 + 16,
self._tHeight + self._tBorder*2 + 8)
进行ping操作,我们得到了您想要的行为。
import wx
import os
import sys
try:
dirName = os.path.dirname(os.path.abspath(__file__))
except:
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(os.path.split(dirName)[0])
try:
from agw import thumbnailctrl as TC
except ImportError: # if it's not there locally, try the wxPython lib.
import wx.lib.agw.thumbnailctrl as TC
class MainFrame(wx.Frame):
def __init__(self, redirect=False, filename=None):
wx.Frame.__init__(self, None, title="Elephant")
# self.SetMenuBar(self.CreateMenuBar())
splitter = wx.SplitterWindow(self, -1, style=wx.CLIP_CHILDREN | wx.SP_3D | wx.WANTS_CHARS | wx.SP_LIVE_UPDATE)
self.panel = wx.Panel(splitter, -1)
sizer = wx.BoxSizer(wx.HORIZONTAL)
scroll = TC.ThumbnailCtrl(splitter, -1, imagehandler=TC.NativeImageHandler)
scroll.ShowFileNames()
if os.path.isdir("../bitmaps"):
scroll.ShowDir(os.path.normpath(os.getcwd() + "/../bitmaps"))
else:
scroll.ShowDir(os.getcwd())
self.TC = scroll
splitter.SplitVertically(scroll, self.panel, 180)
splitter.SetMinimumPaneSize(140)
self.SetMinSize((700, 590))
self.CenterOnScreen()
if __name__ == "__main__":
app = wx.App(False)
frame = MainFrame()
# import wx.lib.inspection
# wx.lib.inspection.InspectionTool().Show()
app.MainLoop()