मैं निम्नलिखित है कहते हैं:मैं विभिन्न प्रकार की टिप्पणियों में एक ही प्रकार परिवर्तनीय का संदर्भ कैसे लगा सकता हूं?
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
पहचान करने के लिए हो सकता है?
जब मैं क्या * scoped प्रकार चर * वास्तव में इसका मतलब है, अविश्वसनीय रूप से स्पष्ट लगता है कि के बारे में सोचते हैं। धन्यवाद। –