Подтвердить что ты не робот

Почему трансформатор монады ListT считается ошибочным - какие законы монады он ломает?

Я уже говорил, что

ListT является классическим примером багги-монадного трансформатора, который не удовлетворяет законам монады .

Можно ли это продемонстрировать на простом примере?

Изменить: Моя идея с ListT [] немного неправильна, я пропустил, что документация требует, чтобы внутренняя монада была коммутативной. Таким образом, ListT багги только в том смысле, что это требование, или есть еще одна проблема? ( примеры в Haskell wiki все используют ListT IO и IO, очевидно, не являются коммутативными.)

4b9b3361

Ответ 1

Простой пример, показывающий, как он не справляется с законом ассоциативности:

v :: Int -> ListT [] Int
v 0 = ListT [[0, 1]]
v 1 = ListT [[0], [1]]

main = do
    print $ runListT $ ((v >=> v) >=> v) 0
    -- = [[0,1,0,0,1],[0,1,1,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0],[0,1,1,1]]
    print $ runListT $ (v >=> (v >=> v)) 0
    -- = [[0,1,0,0,1],[0,1,0,0],[0,1,0,1],[0,1,1,0,1],[0,1,1,0],[0,1,1,1]]

Другие примеры (в основном с использованием IO) и решение о том, как исправить ListT можно найти в ListT done right.