2014-11-13 8 views
5

मैं निम्नलिखित है कहते हैं:मैं विभिन्न प्रकार की टिप्पणियों में एक ही प्रकार परिवर्तनीय का संदर्भ कैसे लगा सकता हूं?

import Control.Monad.Random 

foo :: IO Float 
foo = fmap realToFrac getRandom 

GHC ठीक ही शिकायत के बारे में getRandom के प्रकार जानते हुए भी नहीं; मैं

foo = fmap realToFrac (getRandom :: IO Double) 

कर हालांकि इसे ठीक कर सकते हैं, बजाय पर विचार situtation मैं कहाँ है:

foo :: (Functor m, MonadRandom m) => m Float 
foo = fmap realToFrac getRandom 

मैं नहीं कर सकता केवल

foo = fmap realToFrac (getRandom :: m Double) 

मैं MonadRandom बाधा दोहरानी होगी:

foo = fmap realToFrac (getRandom :: MonadRandom m => m Double) 

बाधाओं की एक बड़ी संख्या के साथ, इसके परिणामस्वरूप बहुत अधिक टाइपिंग होगी। मुझे ऐसा करने की ज़रूरत नहीं है। मुझे पता है कि मैं ScopedTypeVariables इस्तेमाल कर सकते हैं हूँ:

{-# LANGUAGE ScopedTypeVariables #-} 

import Control.Monad.Random 

foo :: MonadRandom m => m Float 
foo = do 
    x :: Double <- getRandom 
    return (realToFrac x) 

लेकिन यह बस के रूप में अत्यधिक शब्द है, और इसके अलावा मैं ऐसे सभी स्थितियों में लागू करने के लिए सक्षम नहीं होगा।

मुझे PartialTypeSignatures प्रस्ताव के बारे में भी पता है। मुझे लगता है कि यह मेरे ऐसा करने की अनुमति दे सकता है:

foo = fmap realToFrac (getRandom :: _ Double) 

लेकिन यह पूरी तरह से खत्म हो गया है अपने (लंबी) विवरण मेरी स्कैन से स्पष्ट नहीं है। दुर्भाग्य से, PartialTypeSignatures प्राइमटाइम के लिए तैयार नहीं है और जैसा कि अभी तक जीएचसी के जारी संस्करण में शामिल नहीं किया गया है।

foo :: (Functor m, MonadRandom m) => m Float 
foo = fmap realToFrac (getRandom :: n Double) 

संभव बात इस तरह की है:

मैं स्पष्ट रूप से अन्य सुझावों का स्वागत है, लेकिन इस समस्या को मैं के बारे में सोच सकते हैं करने के लिए एक समाधान किसी तरह निम्नलिखित में n साथ m पहचान करने के लिए हो सकता है?

उत्तर

8

अपने अंतर्ज्ञान सही था: ScopedTypeVariables इस काम के लिए सही विस्तार है:

{-# LANGUAGE ScopedTypeVariables #-} 

import Control.Monad.Random 

foo :: (Functor m, MonadRandom m) => m Float 
foo = fmap realToFrac (getRandom :: m Double) 
+0

जब मैं क्या * scoped प्रकार चर * वास्तव में इसका मतलब है, अविश्वसनीय रूप से स्पष्ट लगता है कि के बारे में सोचते हैं। धन्यवाद। –

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