2016-02-16 9 views
5
{-# LANGUAGE PatternSynonyms, ViewPatterns #-} 

data Quun = Foo | Bar | Oink Quun 

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink Yum) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

यह सरल सीधे स्वयं चर्चा करते हुए पैटर्न इस अर्थ होगा के लिए, (कम से कम GHC-7.10.2 में)सभी पुनरावर्ती पैटर्न समानार्थी क्यों खारिज कर रहे हैं?

/tmp/wtmpf-file10227.hs:1:1: 
    Recursive pattern synonym definition with following bindings: 
     foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13)) 
     Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28) 

ज़रूर संकलन नहीं है। लेकिन क्या कुछ मौलिक कारण है कि ऊपर के रूप में एक व्यू-पैटर्न मध्यस्थ लेआउट भी संभव नहीं है? मुझे यह विश्वास नहीं मिल रहा है; सब के बाद यह दृश्य पैटर्न इनलाइन और एक पूरी तरह से हानिरहित (अच्छी तरह से ... कम से कम, अनुमति) परिभाषा प्राप्त करना संभव है:

fooey :: Quun -> Bool 
fooey Foo = True 
fooey (Oink (fooey -> True)) = True 
fooey _ = False 

pattern Yum <- (fooey -> True) 

तो, इस तरह के सिर्फ उपलब्ध नहीं समानार्थी शब्द तकनीकी कारणों से अभी तक कर रहे हैं, और होगा हम उन्हें भविष्य में प्राप्त करते हैं?

+0

'पैटर्न समानार्थी' के लेखक यहां: यह एक अच्छा बिंदु है और इसके लिए टिकट खोलने लायक है। यह लागू करना आसान नहीं हो सकता है, हालांकि, अगर मुझे सही याद है, तो जीएचसी मुक्त चर के सेट में "क्यों" कुछ खत्म होने के बारे में अधिक जानकारी का खुलासा नहीं करता है। – Cactus

उत्तर

5

कुछ पुनरावर्ती पैटर्न समस्याग्रस्त हैं,

f :: [()] -> Bool 
f L = True 
f _ = False 

pattern L <-() : L 

की तरह क्या यह करने के लिए desugar माना जाता है?

पैटर्न प्रथम श्रेणी के मान नहीं हैं। वे सिर्फ अपनी परिभाषाओं के साथ बदल दिए जाते हैं जहां वे दिखाई देते हैं। ऐसी भाषा के लिए, पुनरावर्ती परिभाषा आमतौर पर समझदार नहीं होती है।

+2

ठीक है, मैंने सुझाव नहीं दिया था कि सादा बिडरेक्शनल पैटर्न समानार्थी को रिकर्सिव होने की अनुमति दी जानी चाहिए। केवल दृश्य पैटर्न के साथ यह समझ में आता है; लेकिन फिर यह वास्तव में कुछ अच्छे अनुप्रयोगों की अनुमति दे सकता है। – leftaroundabout

+2

अच्छी तरह से 'एल' एक पुनरावर्ती पैटर्न समानार्थी है और इसे अस्वीकार करने की आवश्यकता है, इसलिए यह आपके प्रश्न के शीर्षक से मेल खाता है। मैं मानता हूं कि जब एक समारोह के माध्यम से रिकर्सन जाता है, तो यह ठीक हो सकता है। –

संबंधित मुद्दे