2011-08-27 10 views
7

मैं जानता हूँ कि मैं आम तौर पर सिर्फ पैटर्न मैच कर सकते हैं, लेकिन कभी कभी मैं इन कार्यों उपयोगी पाते हैं:क्या मैं किसी से पूछ सकता हूं कि यह बाएं (या दाएं) है या नहीं?

isLeft = either (const True) (const False) 
isRight = either (const False) (const True) 

वहाँ मानक पुस्तकालय में ऐसा ही कुछ है?

+0

मुझे लगता है कि @ pyrospade चलो अब स्वीकार किए जाते हैं जवाब होना चाहिए। – SwiftsNamesake

उत्तर

19

हालांकि यह बहुत पुराना है, संदर्भ के लिए यहां पोस्ट करना।

यह 4.7 के बाद से Data.Either के तहत मानक लाइब्रेरी में है:

https://hackage.haskell.org/package/base-4.7.0.0/docs/Data-Either.html

isLeft :: Either a b -> Bool

वापसी सच है अगर दिए गए मूल्य एक वाम मूल्य, झूठी अन्यथा है।

isRight :: Either a b -> Bool

वापसी सच है अगर दिए गए मूल्य एक राइट-मूल्य, झूठी अन्यथा है।

3

नहीं, वहां नहीं है, afaik।

लेकिन आप इन कार्यों को परिभाषित कर सकते हैं और भी आसान *:

isLeft (Left _) = True 
isLeft _  = False 

ही, isRight के लिए चला जाता है निश्चित रूप से।

संपादित करें: * ठीक है, मुझे लगता है कि यह विवाद-योग्य है कि यदि आसान या नहीं है, क्योंकि यह कोड का अधिक लाइनों की आवश्यकता है ...

5

नहीं है, लेकिन आप लिख सकते हैं:

import Data.Either 

isLeft = null . rights . return 
isRight = null . lefts . return 
+2

शायद क्योंकि यह कार्यों को परिभाषित करने का एक गैर-सीधा तरीका है। 'या तो' या पैटर्न मिलान का उपयोग करने में परिभाषा शायद अधिक समझ में आ जाएगी। –

+0

हो सकता है।मैं थोड़ा निराश हूं कि 'या तो' के लिए कितने फ़ंक्शन उपलब्ध हैं, इसके साथ काम करने के लिए बहुत कुछ नहीं है। मैं कम से कम 'बाएं मेबेबे :: या तो एक बी -> शायद ए' और इसके समकक्ष की अपेक्षा करता हूं। – Landei

2

जहां तक मुझे पता है, मानक लाइब्रेरी में ऐसा कुछ भी नहीं है। हालांकि, आप इसे आसानी से परिभाषित कर सकते हैं।

either l _ (Left a) = l a 
either _ r (Right b) = r b 

isLeft (Left _) = True 
isLeft _  = False 

isRight (Right _) = True 
isRight _   = False 
+2

ओपी जानना चाहता है कि अलग-अलग नामों के तहत मानक लाइब्रेरी में 'isLeft' और' isRight' हैं या नहीं। वह जानता है कि वह उन्हें पहले से ही 'या तो' के संदर्भ में परिभाषित कर सकता है, जो मानक लाइब्रेरी में * है * है। – dave4420

+3

मैंने इसे +1 किया है क्योंकि समान उत्तरों में -1 नहीं है। वह भी _did_ सवाल का जवाब भी देता है। – alternative

13

के रूप में लोगों की ओर इशारा किया गया है, मानक पुस्तकालय में ऐसी कोई समारोह नहीं है, और आप विभिन्न तरीकों से अपनी खुद की लागू कर सकते हैं।

हालांकि, ध्यान दें कि प्रपत्र के सवाल "मानक पुस्तकालय में है एक्स?" को Hoogle द्वारा आसानी से उत्तर दिया जाता है, भले ही आपको नाम फ़ंक्शन के नाम से पता न हो, तो आप इसे टाइप से खोज सकते हैं।

Hoogle भी बहुत चालाक पता चला है कि तर्क क्रम मायने नहीं रखता है, और यह भी परिणाम जिसका प्रकार समान (जैसे अधिक सामान्य) प्रकार आप के लिए खोज की तुलना में कर रहे हैं दिखा देंगे।

इस मामले में, Either a b -> Booldoes not yield any promising matches के लिए खोज रहे हैं, तो यह एक अच्छा संकेतक है कि यह मानक पुस्तकालय में मौजूद नहीं है।

+1

होगल के लिए सलाह अभी भी अच्छी है, लेकिन ध्यान दें कि मानक लाइब्रेरी * के पास अब ऐसा फ़ंक्शन है; [इस प्रश्न का दूसरा जवाब] देखें (http://stackoverflow.com/a/24046158/1126841)। – chepner