मौजूदा प्रकारों का उपयोग करते समय, हमें forall
एड मान निकालने के लिए पैटर्न-मिलान सिंटैक्स का उपयोग करना होगा। हम साधारण रिकॉर्ड चयनकर्ताओं को कार्यों के रूप में उपयोग नहीं कर सकते हैं। GHC एक त्रुटि रिपोर्ट करता है और yALL
की इस परिभाषा के साथ पैटर्न मिलान उपयोग करने का सुझाव:मैं अस्तित्व में क्वांटिफाइड प्रकार के साथ रिकॉर्ड चयनकर्ता का उपयोग क्यों नहीं कर सकता?
{-# LANGUAGE ExistentialQuantification #-}
data ALL = forall a. Show a => ALL { theA :: a }
-- data ok
xALL :: ALL -> String
xALL (ALL a) = show a
-- pattern matching ok
-- ABOVE: heaven
-- BELOW: hell
yALL :: ALL -> String
yALL all = show $ theA all
-- record selector failed
forall.hs:11:19:
Cannot use record selector `theA' as a function due to escaped type variables
Probable fix: use pattern-matching syntax instead
In the second argument of `($)', namely `theA all'
In the expression: show $ theA all
In an equation for `yALL': yALL all = show $ theA all
अपने डेटा से कुछ अधिक से अधिक 5 तत्वों ले लो।
func1 (BigData _ _ _ _ elemx _ _) = func2 elemx
वहाँ कि पोषणीय की तरह कोड बनाने के लिए या लपेट अप करने के लिए इतना है कि मैं चयनकर्ताओं किसी तरह का उपयोग कर सकते हैं एक अच्छा तरीका है: यह है कि अगर मैं पैटर्न मिलान का उपयोग कोड बनाए रखने के लिए मुश्किल है?
संकेत: 'एए' का प्रकार क्या होगा? –
@ लुइस वासरमैन: क्या आपका मतलब है yALL में मौजूदा वाक्यविन्यास का उपयोग करना? कैसे? – Nybble
असल में, जवाब यह है कि यह एक स्पष्ट प्रकार नहीं है, इसलिए आपको एक व्यावहारिक प्रकार प्राप्त करने के लिए पैटर्न मिलान की आवश्यकता है। –