2012-09-27 16 views
24

BenNeden ListT monad transformer buggy'yi ele alıyor - hangi monad yasalarını ihlal ediyor?

ListTmonad laws tatmin etmeyen bir arabası monad trafonun klasik bir örneğidir dile görüldü ettik.

Bu basit bir örnekle gösterilebilir mi?

Düzenleme:ListT [] ile Benim fikrim biraz yanlış, ben documentation değişmeli olarak iç monad gerektirdiğini kaçırdı. Yani, bu ihtiyacı olan anlamda ListT buggy mi, yoksa başka bir sorun mu var? (examples at Haskell wiki her ListT IO kullanımı ve IO açıkça değişmeli değildir.)

cevap

19

bu birleşim kanunu başarısız gösterir basit bir örnek: nasıl düzeltmek için

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]] 

diğer örnekler (çoğunlukla IO kullanılarak) ve bir çözelti ListTListT done right adresinde bulunabilir.

+2

Belgeler, dönüştürülen monadın değişmeli olması gerektiğini söylüyor; bunu ör. 'v n = ListT $ haritası (read :: String -> Int). permütasyonlar. göstermek . (+ n) ' – applicative

+1

@applicative İyi nokta, bunu özledim. Ben (->) monad ile denedim, ama şimdiye kadar bir karşı örnek bulamadım. –

+8

Eh ... "değişmeyen monad transformatörleri" değil, "monad transformatörler" olarak adlandırılırlar. Bir kaç spesifik monoya uygulandığında sadece doğru bir şekilde çalışan bir transformatör tanımlasaydım, bunu tatmin ediciydi mi? –