Я хочу в основном сопоставить список и в то же время провести некоторое состояние. Я решил объединить список, и монады штата могли бы получить меня там. Я попробовал несколько вещей и понял, что для этого мне, вероятно, нужно использовать 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 вместо каждого элемента.
Как это получить?
Вы хотите 'ssum xs = execState (изменить (+)) xs) 0'? – user3237465
К сожалению, всякий раз, когда кто-либо говорит о «ListT», вам действительно нужно спросить «какой?». потому что существует несколько очень разных версий, которые ведут себя по-разному. – dfeuer