2015-07-08 2 views
2

Я хочу функцию, которая принимает в списке и индексирует все содержимое: indexed :: [a] -> [(Int, a)]. Или возвращаемое значение может быть любым Monad, если оно содержит индексированные значения исходного списка.Индексное содержание списка ([a] -> [(Int, a)])

Я думал, что мне понадобится StateT для временного запоминания и числа индексов при обработке каждого элемента, но я не знаком с трансформатором Monad и мне нужна помощь в написании функции.

Я считаю, что это будет выглядеть примерно так (это точно не работает):

indexed ns = do 
    n <- ns 
    i <- get 
    put (i + 1) 
    return (i, n) 

Как бы вы писать?

+1

http://stackoverflow.com/questions/12658443/how-to-decorate-a-tree-in- haskell –

ответ

6

Не нужно заботиться обо всем этом.

indexed = zip [0..] 

Если вы хотите использовать монады трансформаторы, я думаю, что это:

indexed :: [a] -> [(Int, a)] 
indexed ns = evalState (runListT lt) 0 where 
    lt = do 
     n <- ListT $ return ns 
     i <- get <* modify (+1) 
     return (i, n) 
+0

Ха-ха, это умно! Спасибо за Ваш ответ. Но мне все еще интересно, как это можно реализовать в трансформаторе Monad. –

+1

@RyoichiroOka Существуют разные способы сделать это в [этом вопросе] (http://stackoverflow.com/questions/29125149/how-would-i-use-lens-in-haskell-to-duplicate-pythons-enumerate). – cchalmers

+1

@ RyoichiroOka: Отредактировано. – Ryan

Смежные вопросы