0

给定以下功能

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

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

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

4

2 回答 2

2

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

于 2016-04-15T13:31:17.913 回答
2

首先应用fromNumber到整个输入,然后取该列表的最大值。这样一来,所有无效值都会被转换为Nothingfirst,这maximum将被忽略。

maxInt = fromMaybe 0 . maximum . (map fromNumber)

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

这也修复了一个潜在的错误,如果fromNumber (maximum xs) == Nothing. 在这种情况下,maxInt将返回 0,即使存在一些稍小的值y,例如fromNumber ynot Nothing

于 2016-04-15T13:21:13.230 回答