【发布时间】:2011-10-11 18:43:39
【问题描述】:
如果我想在列表列表中找到最长的列表,最简单的方法可能是:
longestList :: [[a]] -> [a]
longestList = maximumBy (comparing length)
一种更有效的方法是预先计算长度:
longest :: [[a]] -> [a]
longest xss = snd $ maximumBy (comparing fst) [(length xs, xs) | xs <- xss]
现在,我想更进一步。对于正常情况,它可能不会更有效,但是您能使用箭头解决这个问题吗?我的想法基本上是,同时遍历所有列表,并继续步进,直到超出除最长列表之外的每个列表的长度。
longest [[1],[1],[1..2^1000],[1],[1]]
在前面的(非常人为的)示例中,您只需通过每个列表执行两个步骤即可确定列表 [1..2^1000] 是最长的,而无需确定所述列表的整个长度。我可以用箭头来完成吗?如果是这样,那怎么办?如果不是,那为什么不呢?如何实施这种方法?
【问题讨论】:
-
我没有看到任何与箭头的联系。
-
@luqui Using arrows 上的 Haskell Wikibook 的一部分似乎指出箭头对于解析很有用,其方式类似于我对这个问题提出的解决方案(查看每个列表,然后是第二个,等等)Stephen's Arrow Tutorial 给了我同样的感觉:箭头可以用来挖掘这些列表并随时存储信息。
-
我已经接受了一个答案,但是如果有人可以用箭头提出答案,或者彻底解释为什么箭头不相关,那么我肯定会接受那个答案。
标签: list haskell comparison arrows