我有以下功能搜索[Char]并根据它们的索引号返回[Char]:
myList = "abcdefghijk"
searchText = foldl (\acc el -> if elemIndex el myList > Just 11 then el : acc else acc) [] myList
显然,这有点无效,因为elemIndex返回每个元素的索引号,然后应用条件。
是否有更有效的方法来执行此操作?
答案 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