मन इस पलटा कार्यक्रम:दो कार्य प्रकार एनोटेशन के साथ संकलित। एक एनोटेशन निकालें - संकलित नहीं करता है। दो हटाएं - दोबारा संकलित करें। क्यूं कर?
{-# LANGUAGE ScopedTypeVariables, RecursiveDo #-}
import Control.Applicative
import Control.Monad
import Control.Monad.IO.Class
import Prelude hiding (div)
import Reflex.Dom
import qualified Data.Map as M
clickMe :: MonadWidget t m => m (Event t())
clickMe = do
rec (e,_) <- elAttr' "button" M.empty (display c)
c :: Dynamic t Int <- count (domEvent Click e)
return $ domEvent Click e
div :: forall t m a . MonadWidget t m => m a -> m a
div = elAttr "div" ("style" =: "border : 1px solid black")
app :: forall t m . MonadWidget t m => m()
app = div $ do
aClicks <- clickMe
bClicks <- clickMe
a <- count aClicks
b <- count bClicks
l <- combineDyn (\a b -> replicate (a-b)()) a b
simpleList l (const clickMe)
return()
main = mainWidget app
आप या तो div
या app
से टाइप टिप्पणी निकालने हैं, तो प्रोग्राम एक विशाल, डरावना प्रकार की त्रुटि के साथ संकलन नहीं होंगे। यदि आप दोनों को हटाते हैं, तो यह फिर से संकलित होगा। प्रोग्रामर के परिप्रेक्ष्य से, यह एक भयानक उपयोगकर्ता अनुभव देता है जब कोई एक अनियंत्रित प्रोग्राम को बढ़ाने की कोशिश कर रहा है। यह कोई एहसास नहीं है कि एक अनियंत्रित शब्द के लिए एक सही प्रकार की एनोटेशन जोड़ना एक कंपाइलर त्रुटि का कारण बनता है, और यह प्रोग्रामर को लगता है कि उसे गलत प्रकार मिल गया है।
This is the error you get by removing div
's annotation.
ऐसा क्यों होता है?
जब आप प्रकारों को हटाते हैं तो अनुमानित प्रकार क्या होते हैं? वे प्रदत्त प्रकारों से तुलना कैसे करते हैं? यह एक अटकलें है लेकिन मुझे लगता है कि अनुमानित या प्रदत्त प्रकारों में से एक सामान्य जेनेरिक नहीं था और इसलिए असंगत प्रदान किया गया। अनुमानित प्रकारों को जोड़ने से सवाल का जवाब देने में मदद मिल सकती है। – concept3d
मैंने अब प्रश्न पर अनुमानित प्रकार शामिल किए हैं, हालांकि मैं उन्हें समझ नहीं सकता क्योंकि मकड़ियों हैं। – MaiaVictor
मोनोमोर्फिज्म प्रतिबंध –