给出以下功能
maxInt :: Array Number -> Int
maxInt xs = fromMaybe 0 $ join $ fromNumber <$> maximum xs
maxInt [ 2.0, 4.0, 1.0, 5.0 ] => 5
有没有更优雅的方法来做到这一点?有很多剥离Maybe
s
答案 0 :(得分:2)
首先将fromNumber
应用于整个输入,然后取那个列表的最大值。这样,所有无效值首先转换为Nothing
,maximum
将忽略。
maxInt = fromMaybe 0 . maximum . (map fromNumber)
(这是有效的,因为Ord a => Maybe a
是Ord
的实例; Nothing
小于任何Just
值,Just
值由基础排序值。)
如果fromNumber (maximum xs) == Nothing
,这也可以修复潜在的错误。在这种情况下,maxInt
将返回0,即使某个值稍微小一些y
,fromNumber y
不是Nothing
。
答案 1 :(得分:2)
您确定要在默认情况下处理0吗?如果是这样,那么您正在寻找maxInt xs = fromMaybe 0 $ fromNumber =<< maximum xs
。如果没有,请保持“围绕”并执行maxInt = fromNumber <=< maximum
。