2016-10-14 12 views
0

Iは、それらのインデックス番号に基づいて、[チャー]戻る[チャー]を検索し、以下の機能を有する:elemIndex各要素のインデックス番号は、次に条件を適用し返すよう効率的なリスト操作ですか?

myList = "abcdefghijk" 

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

が明らかにこれは幾分inefficentあります。

この操作をより効率的に行う方法はありますか?

+1

は '12はmyListをドロップ:こののより効率的なバージョン、あなたは、高速検索のためのそれらの最初の12個の文字を格納するためのフィルタにそれらをData.Setを使用し、残りの文字列を逆に可能性があるため

'? – chepner

+0

投稿されたコードの正確なセマンティクスを再現するには、 'myList'に複数の文字が存在する可能性があるので、扱いにくいです。しかし、あなたはそれに非常に近いものでOKかもしれないと思います。あなたは、実行したいタスクが何であるかを簡単に表現できますか? – chi

答えて

2

通常のアプローチはprocess

process $ zip [0..] myList 

本当の処理を行うことは、インデックスなどの文字を使用することができます実際の計算を実行する前に、そのインデックスで各文字をペアリングすることです。

いくつかの状況では、この方法はSchwartzian transformとして知られています。

1

この関数は、最初の12文字をスキップして出力を反転し、その最初の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 
関連する問題