【发布时间】:2018-04-26 21:00:18
【问题描述】:
如何获得有效容器的最大元素,其中要比较的计算属性也会触发效果?
必须有更易读的方式来做这样的事情:
latest dir = Turtle.fold (z (ls dir)) Fold.maximum
z :: MonadIO m => m Turtle.FilePath -> m (UTCTime, Turtle.FilePath)
z mx = do
x <- mx
d <- datefile x
return (d, x)
我使用重载版本而不是非重载版本maximumBy,但后者似乎更适合临时属性选择。
我怎样才能更有条理地解决类似的问题?
【问题讨论】:
-
你的一元
maximumBy的类型签名是什么? -
从非单子函数转换为单子函数通常很有用,尤其是当所讨论的函数以某种有趣的方式惰性时。例如,
ifM很有用并且必须手动编写(与liftA3 if'相反),因为它会避免在两个分支中执行其中一种或另一种效果。但是maximumBy必须查看整个列表;所以没有有趣的懒惰需要保留。只需使用像mapM这样的标准单子组合器来预先完成所有效果,然后再进行纯粹的计算。 -
我可能会误解,但这种方法是否允许严格折叠运行而不会出现空间泄漏?
-
@sevo 好点,这是另一个考虑因素,它可能值得手动推出一元版本。