2012-09-27 13 views
24

मैंने कहा देखा है किलिस्टटी मोनैड ट्रांसफार्मर क्यों बग्गी माना जाता है - यह किस मोनैड कानूनों को तोड़ता है?

ListT एक गाड़ी इकाई ट्रांसफार्मर कि monad laws संतुष्ट नहीं करता का एक उत्कृष्ट उदाहरण है।

क्या यह एक साधारण उदाहरण द्वारा प्रदर्शित किया जा सकता है?

संपादित करें:ListT [] साथ मेरा विचार एक सा गलत है, मैं याद किया कि documentation विनिमेय होने की भीतरी इकाई की आवश्यकता है। तो, ListT बग्गी सिर्फ इस अर्थ में है कि इस आवश्यकता है, या कोई और समस्या है? (examples at Haskell wiki सभी ListT IO का उपयोग करें और IO स्पष्ट रूप से विनिमेय नहीं है।)

उत्तर

19

एक साधारण उदाहरण है कि पता चलता है कि यह कैसे संबद्धता कानून में विफल रहता है:

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 done right पर पाया जा सकता है।

+2

प्रलेखन का कहना है कि परिवर्तित मोनड कम्यूटिव होना चाहिए; उदाहरण के साथ इसे आज़माएं 'v n = ListT $ map (पढ़ें :: स्ट्रिंग -> Int)। क्रमपरिवर्तन प्रदर्शन । (+ एन) ' – applicative

+1

@ एप्प्लिकेटिव गुड प्वाइंट, मुझे याद आया। मैंने '(->) 'monad के साथ प्रयास किया, लेकिन अब तक मुझे काउंटर-उदाहरण नहीं मिला। –

+8

खैर ... उन्हें "मोनैड ट्रांसफार्मर" कहा जाता है, न कि "कम्यूटिव मोनड ट्रांसफार्मर"। अगर मैंने एक ट्रांसफॉर्मर को परिभाषित किया है जो कुछ विशिष्ट मोनैड पर लागू होने पर सही ढंग से काम करता है, तो क्या कोई इसे संतोषजनक मानता है? –

संबंधित मुद्दे