是否有更优雅的方式来搜索max和转换为Int

时间:2016-04-15 12:54:38

标签: purescript

给出以下功能

maxInt :: Array Number -> Int
maxInt xs = fromMaybe 0 $ join $ fromNumber <$> maximum xs

maxInt [ 2.0, 4.0, 1.0, 5.0 ] => 5

有没有更优雅的方法来做到这一点?有很多剥离Maybe s

2 个答案:

答案 0 :(得分:2)

首先将fromNumber应用于整个输入,然后取那个列表的最大值。这样,所有无效值首先转换为Nothingmaximum将忽略。

maxInt = fromMaybe 0 . maximum . (map fromNumber)

(这是有效的,因为Ord a => Maybe aOrd的实例; Nothing小于任何Just值,Just值由基础排序值。)

如果fromNumber (maximum xs) == Nothing,这也可以修复潜在的错误。在这种情况下,maxInt将返回0,即使某个值稍微小一些yfromNumber y不是Nothing

答案 1 :(得分:2)

您确定要在默认情况下处理0吗?如果是这样,那么您正在寻找maxInt xs = fromMaybe 0 $ fromNumber =<< maximum xs。如果没有,请保持“围绕”并执行maxInt = fromNumber <=< maximum