私はそれについて言及しました
ListT
モナドの法則を満たさないバギーモナド変換子の典型的な例です。
これは簡単な例で示すことができますか?
編集:私の考えListT []
は少し間違っています。ドキュメントでは内部モナドが可換である必要があることを見逃しました。それで、ListT
この要件があるという意味でバグがありますか、それとも別の問題がありますか?(Haskell wikiの例はすべて使用ListT IO
されており、IO
明らかに可換ではありません。)
私はそれについて言及しました
ListT
モナドの法則を満たさないバギーモナド変換子の典型的な例です。
これは簡単な例で示すことができますか?
編集:私の考えListT []
は少し間違っています。ドキュメントでは内部モナドが可換である必要があることを見逃しました。それで、ListT
この要件があるという意味でバグがありますか、それとも別の問題がありますか?(Haskell wikiの例はすべて使用ListT IO
されており、IO
明らかに可換ではありません。)
結合法則にどのように失敗するかを示す簡単な例:
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
で正しく実行されています。