मैं निम्नलिखित stripPrefixBy
समारोह लागू करना चाहते हैं। मैं जिस प्रकार के पास चाहता हूं उसके साथ stripPrefixBy
को कैसे कार्यान्वित कर सकता हूं?उच्चतर स्थान पर रहीं और impredicative प्रकार
उत्तर
अपने हस्ताक्षर के साथ समस्या यह है कि सूची stripPrefixBy
के लिए पारित कार्य करता है जो एक तर्क के रूप में एक निश्चित एक लेने की एक सूची के रूप में घोषित किया जाता है, और फिर किसी भी ख फोन करने वाले की पसंद के लिए एक Maybe b
उत्पादन है। सूची में कार्यों को केवल ⊥
, Nothing
और Just ⊥
पर लौटने की अनुमति है। वहाँ, forall
निर्माता के प्रकार के लिए आवेदन किया जाता है, यानी
जब impredicative बहुरूपता का उपयोग कर, कहने के लिए है कि, forall
एक ही बात यह एक existentially मात्रा निर्धारित प्रकार के साथ करता है मतलब यह नहीं है
data MyType = forall a. Foo a
Foo :: forall a. a -> MyType
लेकिन यहां यह कह रहा है कि फ़ंक्शन सचमुच forall b. a -> Maybe b
प्रकार का होना चाहिए। के रूप में
stripPrefixBy :: [exists b. a -> Maybe b] -> [a] -> Maybe [a]
एक और प्रतिक्रिया है
{-# LANGUAGE ExistentialQuantification #-}
data Pred a = forall b. Pred (a -> Maybe b)
stripPrefixBy :: [Pred a] -> [a] -> Maybe [a]
stripPrefixBy [] xs = Just xs
stripPrefixBy _ [] = Nothing
stripPrefixBy (Pred p:ps) (x:xs) = case p x of
Just _ -> stripPrefixBy ps xs
Nothing -> Nothing
res :: Maybe String
res = stripPrefixBy [Pred $ const (Just 0), Pred Just] "abc"
wantThisToBeTrue :: Bool
wantThisToBeTrue = case res of
Just "c" -> True
_ -> False
मेरा मानना है कि UHC प्रकार आप सीधे चाहते व्यक्त समर्थन करता है, "तुम क्यों इसे चाहते हैं:
यहाँ एक अस्तित्व प्रकार का उपयोग कर एक को सही उदाहरण है उस प्रकार के लिए? " आप एक ही परिणाम प्रकार के लिए कार्यों की सूची (stripPrefixBy का पहला तर्क) विवश करने के लिए खुश सब कर रहे हैं, तो आप जैसे
res :: Maybe String
res = stripPrefixBy [const (Just undefined), Just] "abc"
उपयोग कर सकते हैं और फिर stripPrefixBy निम्नलिखित Haskell98 प्रकार दे:
stripPrefixBy :: [a -> Maybe b] -> [a] -> Maybe [a]
तुल्य, आप देख सकता है कि पहली बहस में कार्यों के परिणामों का उपयोग नहीं किया जा सकता (कुछ भी नहीं किसी और का उल्लेख है प्रकार "बी") है, तो आप के रूप में अच्छी विधेय की एक सूची हो सकता है:
stripPrefixBy :: [a -> Bool] -> [a] -> Maybe [a]
stripPrefixBy [] xs = Just xs
stripPrefixBy _ [] = Nothing
stripPrefixBy (p:ps) (x:xs) = case p x of
True -> stripPrefixBy ps xs
False -> Nothing
res :: Maybe String
res = stripPrefixBy (map (isJust.) [const (Just undefined), Just]) "abc"
isJust :: Maybe a -> Bool
isJust (Just _) = True
isJust Nothing = False
लेकिन शायद यह सवाल आपके पास एक और जटिल समस्या का अमूर्त है, और सरल प्रतिक्रिया काम नहीं करेगी? सबकुछ जितना संभव हो उतना आसान होना चाहिए, लेकिन कोई आसान नहीं।
- 1. विंडोज XP या उच्चतर
- 2. एंड्रॉइड 4.0 या उच्चतर संस्करण
- 3. उपयोगकर्ता अद्यतन लेबल के बाद उच्चतर रेंडर
- 4. प्रकार या नाम स्थान का नाम 'इकाई' नाम स्थान 'System.Data'
- 5. ढेर और ढेर पर स्मृति स्थान पैटर्न
- 6. फायरवाटिर के विकल्प फ़ायरफ़ॉक्स 4 या उच्चतर
- 7. एक विशिष्ट स्थान पर
- 8. जीडब्ल्यूटी गतिविधियां और स्थान संदर्भित स्थान
- 9. विवरण संसाधन पथ पथ स्थान प्रकार त्रुटियों
- 10. सही स्थान पर UBavigationBar
- 11. CGContextShowTextAtPoint और सफेद स्थान
- 12. टाइपऑफ पर वापसी प्रकार
- 13. रिक्त स्थान और%
- 14. रिक्त स्थान और न्यूलाइन
- 15. लाटेक्स रिक्त स्थान और
- 16. मैक ओएसएक्स पर पाइथन स्थान
- 17. विंडोज 2000 और उच्चतर (डिफ़ॉल्ट और टाइमआउट के साथ) डीओएस विकल्प बैच कमांड
- 18. SLF4J NoSuchMethodError पर स्थान AwareLogger
- 19. एक छिपे हुए टैब बार के स्थान पर सफेद स्थान
- 20. विम - पिछले स्थान पर जाएं
- 21. जावास्क्रिप्ट विंडो। स्थान आईफ़्रेम, पैरेंट विंडो को स्थान पर जाएं
- 22. आईफोन एआरकेट में स्थान एक स्थान पर ओवरलैपिंग
- 23. वेबव्यू के एचटीएमएल स्क्रीन स्थान पर दृश्य का स्पर्श स्थान
- 24. विभिन्न स्थान पर फ़ाइल कॉपी और नाम बदलें
- 25. आईफोन: UINavigationController के शीर्ष पर अजीब स्थान
- 26. भौगोलिक स्थान अक्षांश और देशांतर
- 27. कोर डेटा और कोर स्थान
- 28. सफेद स्थान छोड़ें और सी
- 29. rails.vim और कस्टम नियंत्रक स्थान
- 30. PHP MySQL और भौगोलिक-स्थान
संबंधित q/a: http://stackoverflow.com/questions/19982295/practical-implications-of-runst-vs-unsafeperformio – crockeea