2015-08-24 7 views
17

free MonadPlus रूपControl.MonadPlus.Free के साथ क्या गलत था?

data Free f a = Pure a | Free (f (Free f a)) | Plus [Free f a] 

परिभाषित मुक्त निम्नलिखित टिप्पणी (changelog) के साथ 4.6 में हटा दिया गया था:

निकाला गया Control.MonadPlus.Free। इसके बजाय FreeT f [] का उपयोग करें और परिणाम कानून पालन करने वाला होगा।

समस्या क्या थी, विशेष रूप से, कौन से कानून नहीं थे?

उत्तर

13

बग ट्रैकर में issue के अनुसार पुरानी परिभाषा सहयोगी कानून का पालन नहीं करती है।


हालांकि मैं इस तरह की चीजों के बारे में थोड़ा पता है, मुझे लगता है एक अन्य समस्या अतिरेक है:

Pure a 
Plus [Pure a] 
Plus [Plus [Pure a]] 
... 

सब एक ही बात का प्रतिनिधित्व करने लगते हैं। नि: शुल्क संरचनाओं को आम तौर पर अद्वितीय माना जाता है। ऐसे समय होते हैं जब उन्हें विशिष्ट रूप से प्रदर्शित नहीं किया जा सकता है (उदाहरण के लिए, मुक्त एबेलियन समूह) लेकिन जब संभव हो तो उन्हें होना चाहिए।

दरअसल, मुझे लगता है कि सुझाए गए विकल्प एक ही समस्या से पीड़ित हैं, हालांकि के बजाय NonEmpty का उपयोग कर इसे सुधारना संभव हो सकता है। तो यह परिवर्तन पुस्तकालय से अतिरिक्त क्रूर को हटाने का मामला हो सकता है।

+3

आपको किसी पोस्ट में "अपडेट" या "एडिट" जैसी चीज़ों का उपयोग नहीं करना चाहिए। संपादन इतिहास पर्याप्त रूप से देखने के लिए पर्याप्त है जब कुछ बदल गया/जोड़ा गया था। मैंने उन्हें हटाने की स्वतंत्रता ली (लेकिन सामग्री नहीं) और उस हिस्से को स्थानांतरित किया जो शीर्ष पर बग ट्रैकर का संदर्भ देता है, ताकि यह अधिक आसानी से सुलभ हो। – Bakuriu

+0

@ बाकुरीयू वास्तव में? तो, तुरंत यह देखने के बजाय कि कुछ बदल गया था, हम संपादन इतिहास में खोदना चाहते हैं? क्या सामान्य तरीका सिर्फ इतना आसान है? – MigMit

+3

@MigMit "सामान्य तरीका", जैसा कि आप इसे कहते हैं, ** शोर ** है। अगर मैं एक उत्तर की तलाश में हूं तो अंत में 2 लाइन उत्तर के साथ समाप्त होने के लिए मुझे असंबद्ध "संपादन" की सैकड़ों लाइनें क्यों पढ़नी चाहिए? उत्तर को उपयोगिता को अधिकतम करना चाहिए, जिसका अर्थ है पठनीय और आसानी से सुलभ होना।विभिन्न ब्लॉक में जानकारी विभाजित करना आम तौर पर एक अच्छा समाधान नहीं है। यह ठीक हो सकता है जब प्रश्न/उत्तर अभी भी अस्पष्ट/अधूरा है लेकिन एक बार यह स्पष्ट हो जाने पर सामग्री अच्छी तरह व्यवस्थित होनी चाहिए। अगर कोई यह देखने के लिए उत्सुक है कि यह कैसे विकसित हुआ है तो वह संपादन इतिहास को देख सकता है, लेकिन वह मेटाडेटा है। – Bakuriu

1

मुझे विश्वास है कि प्रतिनिधित्व ही ठीक था और वैधता

iter :: (Functor f, Monoid a) => (f a -> a) -> Free f a -> a 
iterM :: (MonadPlus m, Functor f) => (f (m a) -> m a) -> Free f a -> m a 

यानी

  • उपयोग Monoid a बजाय करने के लिए इन विधि हस्ताक्षर

    iter :: Functor f => (f a -> a) -> ([a] -> a) -> Free f a -> a 
    iterM :: (Monad m, Functor f) => (f (m a) -> m a) -> ([m a] -> m a) -> Free f a -> m a 
    

    बदलकर निदान नहीं कर सकता था कि मनमाने ढंग से फ़ंक्शन आयन [a] -> aiter में;

  • उपयोग MonadPlus miterM में एक मनमाना समारोह [m a] -> m a के बजाय।

मेरा अनुमान है कि इसे हटा दिया गया था (निश्चित रूप से निश्चित) क्योंकि FreeT f [] के बराबर रखने के लिए यह उचित नहीं है।

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