2011-07-10 17 views
7

हैलो Haskellers और Haskellettes,Haskell नेस्ट खाली सूचियों

जब http://learnyouahaskell.com/ पढ़ने मेरा एक दोस्त एक समस्या के साथ आया था -sub -_- sublists खाली हैं। मेरा पहला अनुमान था - होना चाहिए - लेकिन मुझे टाइप एनोटेशन लिखने में बड़ी समस्या है। काम नहीं कर रहा - -

वह जैसे

nullRec l = if null l 
       then True 
       else if [] `elem` l 
        then nullRec (head [l]) && nullRec (tail l) 
        else False 

जो कुछ है की कोशिश की :-)

मैं

  • concat साथ तह की तरह कुछ के साथ आया था - आ ही लंबी सूची प्राप्त करने के लिए
    (मुझे समस्याएं लागू करने में समस्याएं)
  • या एक अनंत ट्रेलीइक डेटाटाइप बनाना - और सूची
    से बना (अभी तक लागू नहीं किया है)

लेकिन बाद इस समस्या के लिए overkill की तरह एक सा ध्वनि। अग्रिम


सभी टिप्पणियों की प्रतिक्रिया के रूप में इस तरह ;-)

धन्यवाद एक धूप रविवार को - - क्या अपने विचारों है इस किया जा रहा बुरा शैली मैं जोड़ने के लिए इस है करना चाहते हैं बस एक प्रयोग!
घर पर यह कोशिश न करें! ;-)

+3

इस तरह के फ़ंक्शन का प्रकार क्या होना चाहिए (यदि आप इसे सामान्य सूचियों पर लागू करते हैं)! – yatima2975

+0

मैं इसके बारे में सोचता हूं - यह अनंत होना चाहिए [[... [ए] ...]] लेकिन हैकेल में लिखना संभव नहीं है - यही कारण है कि मैं दूसरे दृष्टिकोण के साथ आया था। लेकिन क्या ऐसा करने का एक आसान तरीका है। इसके अतिरिक्त मेरा दिमाग थोड़ा धीमा है क्योंकि आज मैं बीमार हूं। – epsilonhalbe

+2

बीमार या नहीं, आप सही रास्ते पर हैं! कार्यों के परिवार को लिखना काफी आसान है 'nullRec2 :: [[a]] -> बूल',' nullRec3 :: [[[a]]] -> बूल 'और इतने पर (जोड़े को आजमाएं!), लेकिन आप उन्हें आसानी से एक प्रकार के हस्ताक्षर फिट करने के लिए नहीं मिल सकता है। आपको या तो एक पेड़ प्रकार की आवश्यकता है जैसे 'डेटा ट्री ए = शाखा [वृक्ष ए] | नोड ए 'या शायद टाइपक्लास के साथ कुछ संभव है (अभी तक इस दृष्टिकोण के बारे में ज्यादा नहीं सोचा है)। – yatima2975

उत्तर

5

एक टाइपक्लास के बारे में कैसे?

{-# LANGUAGE FlexibleInstances, OverlappingInstances #-} 

class NullRec a where 
    nullRec :: a -> Bool 

instance NullRec a => NullRec [a] where 
    nullRec [] = True 
    nullRec ls = all nullRec ls 

instance NullRec a where 
    nullRec _ = False 

main = print . nullRec $ ([[[[()]]]] :: [[[[()]]]]) 
+5

अधिक सटीक, आप न केवल एक प्रकार की कक्षा का उपयोग कर रहे हैं बल्कि जीएचसी एक्सटेंशन [ओवरलैपिंग इंस्टेंस] (http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/type-class-extensions.html # उदाहरण-ओवरलैप)। इस विस्तार के बिना, एक प्रकार की कक्षा का उपयोग करने से भी प्रश्न में आवश्यक चीज़ों को प्राप्त नहीं किया जा सकता है। यह दृढ़ता से सुझाव देता है कि अगर कोई इसे लागू करने के लिए (एक प्रयोग के अलावा), प्रोग्राम शायद सही तरीके से डिज़ाइन नहीं किया गया है। –

4

निम्नलिखित के कारण केवल पैरामीट्रिक पॉलिमॉर्फिज्म का उपयोग करना संभव नहीं है। जाहिर है

x = [8] :: [Int] 
y = [3.0] :: [Double] 
z = [[]] :: [[Int]] 

, आप अपने समारोह x और y दोनों के साथ काम करना चाहते हैं, इस प्रकार अपने प्रकार null1 :: [a] -> Bool होना चाहिए:

इन मूल्यों पर विचार करें। (किसी ने मुझे इस तर्क को औपचारिक बनाने में मदद कर सकते हैं? मैं कैसे दिखा सकते हैं कि इस अनूठी सबसे विशिष्ट संदर्भ-कम प्रकार [Int] -> Bool और [Double] -> Bool साथ unifiable है? वहाँ प्रकार के बीच है कि संबंध के लिए एक नाम है?)

अब , यदि आपके पास यह प्रकार है, तो null1 znull1 x के बराबर होगा क्योंकि वे केवल सूची तत्वों के मानों में भिन्न होते हैं, जिन्हें से दूर किया गया है।

क्या आप z के लिए चाहते हैं null2 :: [[a]] -> Bool है, जो व्यवहार में अलग होगा है, और इस तरह null1 और null2 एक ही नाम ओवरलोडिंग की आवश्यकता होगी दे रही है (यहां तक ​​कि फिर से औपचारिक प्रमाण :(के करीब नहीं)।(FUZxxl का उत्तर देखें)

+0

मुझे लगता है कि तर्क काफी दृढ़ विश्वास है। – luqui

+0

मुझे लगता है कि 'शून्य 1। (: []) :: ए -> बूल 'हमें औपचारिक प्रमाण के करीब लाता है, लेकिन मुझे अभी भी पता नहीं है कि आखिरी कदम कैसे बनाया जाए (यह दिखा रहा है कि' ए -> बूल '' बूल 'जैसा ही है)। – Rotsor

+0

यह रिवर्स में एक मुक्त प्रमेय है, लेकिन 'इंट' और 'डबल' की सबसे बड़ी निचली सीमा (हास्केल संदर्भ-मुक्त प्रकार की जाली पर, संबंध के रूप में पदार्थ के साथ) 'ए' है, क्योंकि आप नहीं कर सकते उनमें से दोनों में विकल्प प्रकार चर (कोई भी नहीं है!) और एक ही प्रकार के साथ समाप्त होता है। या क्या मैं अपने ऊपर और नीचे दिशानिर्देश मिश्रित कर रहा हूं? – yatima2975

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