有没有更优雅的方法来搜索 max 并转换为 Int

Is there a more elegant way to do search for max and conversion to Int

给定以下函数

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

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

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

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

maxInt = fromMaybe 0 . maximum . (map fromNumber)

(这是有效的,因为 Ord a => Maybe aOrd 的一个实例;Nothing 小于任何 Just 值,并且 Just 值按基础价值。)

如果 fromNumber (maximum xs) == Nothing,这也修复了一个潜在的错误。在那种情况下,maxInt 会 return 0,即使有一些稍微小一点的值 y 这样 fromNumber y 不是 Nothing.

您确定要使用默认大小写 0 来处理吗?如果是这样,您正在寻找 maxInt xs = fromMaybe 0 $ fromNumber =<< maximum xs。如果没有,请保留 Maybe 并像 maxInt = fromNumber <=< maximum.

那样做