2011-11-04 4 views
7

मैं निम्नलिखित समारोह लिखा है:जीएचसी एसटी मोनैड कोड को टाइप वैरिएबल को एकीकृत करने में असमर्थ के रूप में अस्वीकार करता है?

(.>=.) :: Num a => STRef s a -> a -> Bool 
r .>=. x = runST $ do 
v <- readSTRef r 
return $ v >= x 

लेकिन जब मैं संकलन करने की कोशिश की मैं निम्नलिखित त्रुटि मिली:

Could not deduce (s ~ s1) 
from the context (Num a) 
    bound by the type signature for 
      .>=. :: Num a => STRef s a -> a -> Bool 
    at test.hs:(27,1)-(29,16) 
    `s' is a rigid type variable bound by 
     the type signature for .>=. :: Num a => STRef s a -> a -> Bool 
     at test.hs:27:1 
    `s1' is a rigid type variable bound by 
     a type expected by the context: ST s1 Bool at test.hs:27:12 
Expected type: STRef s1 a 
    Actual type: STRef s a 
In the first argument of `readSTRef', namely `r' 
In a stmt of a 'do' expression: v <- readSTRef r 

किसी को भी मदद कर सकते हैं?

उत्तर

12

यह बिल्कुल इरादा है। STRef केवल runST के एक रन में मान्य है। और आप runST के एक नए भाग में बाहरी STRef डालने का प्रयास करते हैं। यह मान्य नहीं है। यह शुद्ध कोड में मनमाना दुष्प्रभावों की अनुमति देगा।

तो, आप जो प्रयास करते हैं वह हासिल करना असंभव है। डिजाइन द्वारा!

7

आप ST संदर्भ में रहने की जरूरत:

(.>=.) :: Ord a => STRef s a -> a -> ST s Bool 
r .>=. x = do 
v <- readSTRef r 
return $ v >= x 

(और के रूप में Hammar बताते हैं, >= उपयोग करने के लिए आप Ord typeclass, जो Num प्रदान नहीं करता है की जरूरत है।) यह है कि

+1

नोट अभी भी चेक टाइप नहीं करेगा, क्योंकि बाधा 'ऑर्ड' होनी चाहिए, न कि 'न्यू'। – hammar

+0

इसे तलाशने के लिए धन्यवाद। – dave4420

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