25

私はそれについて言及しました

ListTモナドの法則を満たさないバギーモナド変換子の典型的な例です。

これは簡単な例で示すことができますか?

編集:私の考えListT []は少し間違っています。ドキュメントでは内部モナドが可換である必要があることを見逃しました。それで、ListTこの要件があるという意味でバグがありますか、それとも別の問題がありますか?(Haskell wikiの例はすべて使用ListT IOされており、IO明らかに可換ではありません。)

4

1 に答える 1

20

結合法則にどのように失敗するかを示す簡単な例:

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)と修正方法の解決策は、 ListTListTで正しく実行されています。

于 2012-09-27T09:12:58.523 に答える