इसके अलावा, एक विकल्प का उपयोग करने के Scrap your boilerplate (उर्फ "SYB") है। यह आपको किसी दिए गए प्रकार के पहले उपमहाद्वीप को खोजने की अनुमति देता है। तो तुम
{-# LANGUAGE DeriveDataTypeable #-}
import Control.Monad
import Data.Data
import Data.Generics.Schemes
import Data.Typeable
data Foo = X (String, Int) | A String | B String | C String | D String
deriving (Show, Eq, Ord, Data, Typeable)
fooString :: Foo -> Maybe String
fooString = msum . gmapQ cast
निर्धारित कर सकते हैं और fooString
अपने निर्माताओं की पहली String
तर्क वापस आ जाएगी। फंक्शन cast
String
एस और gmapQ
फ़िल्टर करता है सभी तत्काल उपखंडों के लिए फ़िल्टर किए गए मान प्राप्त करता है।
हालांकि, इस X
से String
वापस नहीं होगा, क्योंकि X
तत्काल कोई String
subterm है, यह प्रकार (String, Int)
का केवल एक ही subterm है। आदेश अवधि पदानुक्रम में कहीं भी पहले String
पाने के लिए, आप इस्तेमाल कर सकते हैं everywhere
:
fooString' :: Foo -> Maybe String
fooString' = everything mplus cast
ध्यान दें कि इस दृष्टिकोण से थोड़ा कमजोर है: यह बस सभी String
यह पाता है, हमेशा आप क्या चाहते हैं नहीं हो सकता है जिसमें शामिल , विशेष रूप से, यदि आप बाद में अपना डेटा प्रकार (या कुछ डेटा प्रकार जो संदर्भित करते हैं) का विस्तार करते हैं।
स्रोत
2015-08-22 18:39:22
हालांकि भाषा में ऐसी कोई चीज़ उपलब्ध नहीं है (सिवाय इसके कि आप [जेनेरिक] (https://wiki.haskell.org/Generics) या [टेम्पलेट हास्केल] (https: //wiki.haskell) का उपयोग करने पर विचार कर सकते हैं। संगठन/टेम्पलेट_हास्केल) इस तरह के कोड उत्पन्न करने के लिए। क्या यह आपके उपयोग के मामले के लिए उचित होगा? –