2015-10-04 4 views
3

Я хочу в основном сопоставить список и в то же время провести некоторое состояние. Я решил объединить список, и монады штата могли бы получить меня там. Я попробовал несколько вещей и понял, что для этого мне, вероятно, нужно использовать ListT. Как упрощенная версия моей реальной проблемы, представьте, что я хочу реализовать функцию sum, а также вернуть измененную версию исходного списка. Это или подобное, что я представлял себе, что бы выглядеть следующим образом:Как совместить список и государственную монаду в Haskell

sum' :: ListT (State Int) Int 
sum' = do 
    lift $ put 0 
    x <- [1,2,3] 
    lift $ modify (+x) 
    return $ x + 1 

То, что я не получаю еще как синтаксис регулярного списка монады переводится монады ListT. Я не могу просто сделать x <- [1,2,3], так как в правой части стрелки ожидается тип ListT (State Int) t0. x <- return [1,2,3] компилирует (как и в том, что компилятор не жалуется на эту строку), но получает весь список, помещенный в x вместо каждого элемента.

Как это получить?

+0

Вы хотите 'ssum xs = execState (изменить (+)) xs) 0'? – user3237465

+0

К сожалению, всякий раз, когда кто-либо говорит о «ListT», вам действительно нужно спросить «какой?». потому что существует несколько очень разных версий, которые ведут себя по-разному. – dfeuer

ответ

4
x <- ListT $ return [1,2,3] 

или

x <- msum $ return <$> [1,2,3] 

будет делать трюк.

  • ListT . return только впрыскивает список структурно-awarely в список трансформированных монады стека.

  • msum использует тот факт, что ListT является трансформатором, отображающим монаду на свободный MonadPlus моноид над ним.

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