map を使用しているときに、haskell で現在の要素のインデックスを取得するにはどうすればよいですか?
たとえば、このリストがl = "a+bc?|(de)*fg|h"
あり、関数を使用するときに現在いる要素の正確なインデックスを知りたいとしmap or scanl
ます。
Nikita Volkovの回答を修正すると、次のような関数を使用できます。
-- variant of map that passes each element's index as a second argument to f
mapInd :: (a -> Int -> b) -> [a] -> [b]
mapInd f l = zipWith f l [0..]
まず第一に、リストを処理するときにインデックスが必要な場合、リストは配列のようなインデックスベースの構造ではないため、次善のアルゴリズムを実装しているという特定の兆候です。インデックスを扱う必要がある場合は、代わりにベクトルを使用することを検討してください。
実際の質問に関しては、次のコードを使用して、リストの項目と増分 int をペアにして、結果をマップできます。
Prelude> zip [0..] "a+bc?|(de)*fg|h" :: [(Int, Char)]
[(0,'a'),(1,'+'),(2,'b'),(3,'c'),(4,'?'),(5,'|'),(6,'('),(7,'d'),(8,'e'),(9,')'),(10,'*'),(11,'f'),(12,'g'),(13,'|'),(14,'h')]