高效的列表操作?

时间:2016-10-14 11:47:05

标签: list haskell

我有以下功能搜索[Char]并根据它们的索引号返回[Char]:

myList = "abcdefghijk"

searchText = foldl (\acc el -> if elemIndex el myList > Just 11 then el : acc else acc) [] myList

显然,这有点无效,因为elemIndex返回每个元素的索引号,然后应用条件。

是否有更有效的方法来执行此操作?

2 个答案:

答案 0 :(得分:2)

通常的做法是在进行实际处理之前将每个字符与其索引配对

process $ zip [0..] myList

现在process可以执行实际计算,可以使用索引和字符。

在某些情况下,这种方法称为Schwartzian transform

答案 1 :(得分:1)

你的函数返回一个跳过前十二个字符的字符串并反转输出,删除前十二个字符中的任何字符。

对于更高效的版本,您可以使用Data.Set存储前12个字符以进行快速查找,过滤掉它们并反转字符串的其余部分:

import qualified Data.Set as Set

searchText =
    let hash = (Set.fromList . take 12) myList
    in (reverse . filter (flip Set.notMember hash) . drop 12) myList
相关问题