प्रश्न। क्या इस कोड को स्पष्ट प्रकार के हस्ताक्षर के बिना काम करने का कोई तरीका है?जीएचसी प्रकार अनुमान वज़न
कोड। सबसे पहले, मेरे पास Data.Newtype
से प्रेरित, एक अभ्यास-बहुत-अच्छा वैकल्पिक MonadTrans
वर्ग है। यह तो इस तरह दिखता है,
{-# LANGUAGE FlexibleContexts, TypeFamilies #-}
module Alt.Control.Monad.Trans where
import Control.Monad
class (Monad , Monad (BaseMonad)) => MonadTrans (:: * -> *) where
type BaseMonad :: * -> *
lift :: (BaseMonad) α -> α
, मैं विधि foo
के साथ एक कक्षा A
है, और यदि कुछ आधार इकाई M
एक A
है, तो किसी भी तब्दील इकाई T M
भी एक A
है। कोड में,
class A where
foo :: String -> ()
instance (A (BaseMonad), MonadTrans) => A where
foo n = lift $ foo n
हालांकि, अगर मैं अब अपनी पहली तर्क प्रतिस्थापित साथ foo
के लिए एक शॉर्टकट बनाना चाहते हैं, तो मैं एक स्पष्ट प्रकार हस्ताक्षर, या संकलक के संदर्भ ढेर अतिप्रवाह की जरूरत है।
minimize_call :: A => ()
minimize_call = foo "minimize"
संभव जानकारी अनुमान में मदद करेगा। मान लें कि हमारे पास एक संबद्ध प्रकार B :: * -> *
है। मैं सोच रहा हूं कि मैं संकलक B
को B t /= t
, B (B t) /= B t
इत्यादि को संतुष्ट करता हूं यानी B
किसी भी तरह "monotonic" है - जो संबंधित प्रकार का पीछा करते हैं, नए प्रकार के रैपर को हटाने के बराबर है, और यह जानना चाहिए कि यह हमेशा के लिए नए प्रकार के रैपर को नहीं हटा सकता , इसलिए हस्ताक्षर के लिए संदर्भ A
जोड़ना जरूरी है।
क्षमा करें, मुझे याद रखने के लिए परेशान होना चाहिए _why_ मैंने वैकल्पिक 'मोनाडट्रान' पर स्विच किया है ... अभी मान लें कि यह क्लीनर कोड उत्पन्न करता है, लेकिन मुझे लगता है कि एक और अधिक महत्वपूर्ण कारण था। – gatoatigrado
दिलचस्प सवाल। हालांकि आप एक स्पष्ट प्रकार के हस्ताक्षर क्यों नहीं चाहते हैं? 'Minimize_call' को कुछ निश्चित मान नहीं होना चाहिए, न कि पॉलिमॉर्फिक निरंतर (या शायद आप इसे पॉलिमॉर्फिक प्राप्त कर सकते हैं, मुझे यकीन नहीं है)? यदि इसमें कुछ निश्चित प्रकार है, तो मैं इसे दस्तावेज करता हूं, और यदि ऐसा नहीं होता है, तो मैं ** ** ** दस्तावेज़ दूंगा। पाठक को अपने सिर में पूरे प्रोग्राम विश्लेषण करने के लिए मजबूर करना यह पता लगाने के लिए कि 'minimize_call' किस प्रकार का काउंटर-उत्पादक लगता है। – Ben
@ बेन, यह सच है कि, इस मामले में, 'minimize_call' के लिए एक प्रकार का हस्ताक्षर होना अच्छा अभ्यास है।हालांकि, टाइप अनुमान को तोड़ने से पता चलता है कि कुछ गलत हो रहा है (डिजाइनर, कंपाइलर या कंपाइलर के साथ संचार के साथ), और संभावित रूप से समस्याएं पैदा कर सकती हैं, अनावश्यक त्रुटि संदेशों का उल्लेख नहीं करना। – gatoatigrado