2016-10-14 68 views
0

我有以下功能,通過[字符]並返回[字符]基於它們的索引號搜索:高效的列表操作?

myList = "abcdefghijk" 

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

顯然,這是多少有些inefficent作爲elemIndex返回每個元素的索引編號,然後施加的條件。

是否有更高效的執行此操作的方法?

+1

'下降12 myList中'? – chepner

+0

重現發佈代碼的確切語義是棘手的,因爲'myList'中可能有不止一個字符出現。不過,我認爲你可能會接受這樣的事情。你能用簡單的話來表達你想要實現的任務嗎? – chi

回答

2

通常的方法是進行實際處理

process $ zip [0..] myList 

現在process可以執行實際的計算,可同時使用的索引以及該字符之前進行配對它的索引的每個字符。

在某些情況下,這種方法被稱爲Schwartzian transform

1

您的函數返回一個字符串,該字符串會跳過前12個字符並反轉輸出,並丟棄前12個字符。

對於這種更有效率的版本,你可以使用Data.Set存儲爲快速查找那些前十二個字符,他們篩選出和反向字符串的其餘部分:

import qualified Data.Set as Set 

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