我有以下功能,通過[字符]並返回[字符]基於它們的索引號搜索:高效的列表操作?
myList = "abcdefghijk"
searchText = foldl (\acc el -> if elemIndex el myList > Just 11 then el : acc else acc) [] myList
顯然,這是多少有些inefficent作爲elemIndex返回每個元素的索引編號,然後施加的條件。
是否有更高效的執行此操作的方法?
我有以下功能,通過[字符]並返回[字符]基於它們的索引號搜索:高效的列表操作?
myList = "abcdefghijk"
searchText = foldl (\acc el -> if elemIndex el myList > Just 11 then el : acc else acc) [] myList
顯然,這是多少有些inefficent作爲elemIndex返回每個元素的索引編號,然後施加的條件。
是否有更高效的執行此操作的方法?
通常的方法是進行實際處理
process $ zip [0..] myList
現在process
可以執行實際的計算,可同時使用的索引以及該字符之前進行配對它的索引的每個字符。
在某些情況下,這種方法被稱爲Schwartzian transform。
您的函數返回一個字符串,該字符串會跳過前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
'下降12 myList中'? – chepner
重現發佈代碼的確切語義是棘手的,因爲'myList'中可能有不止一個字符出現。不過,我認爲你可能會接受這樣的事情。你能用簡單的話來表達你想要實現的任務嗎? – chi