खोज…


प्रॉक्सी का उपयोग करना

Proxy :: k -> * प्रकार, Data.Proxy में पाया जाता है, का उपयोग तब किया जाता है जब आपको कंपाइलर को कुछ प्रकार की जानकारी देने की आवश्यकता होती है - जैसे, एक प्रकार की श्रेणी का उदाहरण लेने के लिए - जो कि रनटाइम के दौरान अप्रासंगिक है।

{-# LANGUAGE PolyKinds #-}

data Proxy a = Proxy

कार्य करता है जो एक का उपयोग Proxy आमतौर पर उपयोग ScopedTypeVariables एक प्रकार वर्ग के आधार पर उदाहरण लेने के लिए a प्रकार।

उदाहरण के लिए, एक अस्पष्ट कार्य का उत्कृष्ट उदाहरण,

showread :: String -> String
showread = show . read

जिसके परिणामस्वरूप एक प्रकार की त्रुटि होती है क्योंकि विस्तारक को यह नहीं पता होता है कि कौन सा उदाहरण Show या Read का उपयोग करें, Proxy का उपयोग करके हल किया जा सकता है:

{-# LANGUAGE ScopedTypeVariables #-}

import Data.Proxy

showread :: forall a. (Show a, Read a) => Proxy a -> String -> String
showread _ = (show :: a -> String) . read

जब साथ एक समारोह बुला Proxy , आप घोषणा जो करने के लिए एक प्रकार का एनोटेशन उपयोग करने की आवश्यकता a आप का मतलब है।

ghci> showread (Proxy :: Proxy Int) "3"
"3"
ghci> showread (Proxy :: Proxy Bool) "'m'"  -- attempt to parse a char literal as a Bool
"*** Exception: Prelude.read: no parse

"बहुरूपिया छद्म" मुहावरा

चूंकि Proxy में कोई रनटाइम जानकारी नहीं होती है, इसलिए Proxy कंस्ट्रक्टर पर पैटर्न-मैच करने की आवश्यकता नहीं है। तो एक सामान्य मुहावरा एक प्रकार के चर का उपयोग करके Proxy डेटाटाइप पर अमूर्त करना है।

showread :: forall proxy a. (Show a, Read a) => proxy a -> String -> String
showread _ = (show :: a -> String) . read

अब, अगर आप एक हैं तो आप fa कुछ के लिए दायरे में f , आप को लिखने के लिए की जरूरत नहीं है Proxy :: Proxy a जब बुला f

ghci> let chars = "foo"  -- chars :: [Char]
ghci> showread chars "'a'"
"'a'"

प्रॉक्सी की तरह है ()

चूंकि Proxy में कोई रनटाइम जानकारी नहीं होती है, आप हमेशा एक प्राकृतिक परिवर्तन fa -> Proxy a लिख सकते हैं fa -> Proxy a किसी भी f लिए fa -> Proxy a

proxy :: f a -> Proxy a
proxy _ = Proxy

यह वैसा ही है जैसे किसी भी दिए गए मान को हमेशा के लिए मिटाया जा सकता है () :

unit :: a -> ()
unit _ = ()

तकनीकी रूप से, Proxy , मानदंड की श्रेणी में टर्मिनल ऑब्जेक्ट है, जैसे () मानों की श्रेणी में टर्मिनल ऑब्जेक्ट है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow