यह प्रतिबिंब-0.5 से लिया गया एक न्यूनतम उदाहरण है।हास्केल: यह टाइप-चेक क्यों करता है?
>:t Zero
Zero :: Zero -> Zero
यह समझ में आता है: मैं निर्माता है जो एक शून्य लेता है और एक शून्य रिटर्न के प्रकार के लिए पूछ रहा हूँ
{-# LANGUAGE Rank2Types, MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
{-# OPTIONS_GHC -fno-cse -fno-full-laziness -fno-float-in #-}
import Control.Applicative
import Data.Proxy
newtype Zero = Zero Zero deriving (Show)
class ReifiesNum s where
reflectNum :: Num a => proxy s -> a
instance ReifiesNum Zero where
reflectNum = pure 0
GHCi में, मैं निम्नलिखित मिलता है।
>:t reflectNum
reflectNum :: (ReifiesNum s, Num a) => proxy s -> a
यह भावना है कि मैं की तरह
>let x = Just (undefined::Zero)
>reflectNum x
क्योंकि प्रकार बस शून्य से मेल खाता प्रकार चर 'प्रॉक्सी s' कुछ लिख सकता है बनाता है।
अंत में, भ्रामक हिस्सा:
>:t (reflectNum Zero)
(reflectNum Zero) :: Num a => a
मुझे समझ नहीं आता कैसे निर्माता शून्य :: शून्य के प्रकार -> शून्य जाहिरा तौर पर मेल खाता प्रकार चर 'प्रॉक्सी s', लेकिन जाहिरा तौर पर इसकी वजह करता है प्रकार (reflectNum शून्य) सिर्फ 'ए' है।
मैं इस उदाहरण को समझने में सहायता की सराहना करता हूं, और प्रासंगिक अवधारणाओं के लिंक की सराहना की जाएगी।
धन्यवाद
"(->) शून्य" वैध प्रकार क्यों है? मैं कल्पना नहीं कर सकता कि मैं कुछ कैसे लिख सकता हूं "> चलो एक्स = [कुछ] :: ((->) शून्य)"। मुझे आशा है कि मैं समझ में आ रहा हूं। जवाब के लिए धन्यवाद! – crockeea
@Eric '(->) शून्य 'वैध प्रकार नहीं है, यह एक * प्रकार का कन्स्ट्रक्टर * है, जिसे एक ठोस प्रकार बनाने के लिए किसी अन्य प्रकार पर लागू करने की आवश्यकता है। 'शायद' के बारे में भी यही सच है; 'शायद' प्रकार के कोई मान नहीं हैं, लेकिन 'हो सकता है', 'शायद [डबल]', 'शायद (शायद (शायद चार))', आदि के मान हैं। इसी प्रकार, प्रकार के कोई मूल्य नहीं हैं' (->) शून्य ', लेकिन प्रकार के मूल्य हैं (->) शून्य शून्य' यानी शून्य -> शून्य '। – Ben
धन्यवाद बेन। मैं इंफिक्स बनाम उपसर्ग नोटेशन याद कर रहा था, लेकिन अब यह स्पष्ट है! – crockeea