Haskell Language
प्रॉक्सी
खोज…
प्रॉक्सी का उपयोग करना
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
, मानदंड की श्रेणी में टर्मिनल ऑब्जेक्ट है, जैसे ()
मानों की श्रेणी में टर्मिनल ऑब्जेक्ट है।