2015-03-16 6 views
6

मैं हास्केल में अभी शुरुआत सांकेतिक शब्दों में बदलनेवाला हूँ, इस अद्भुत पुस्तक के प्रथम अध्याय से एक अभ्यास कर रही है:हास्केल नेस्ट जहां खंड

-- test comment 
main = interact wordCount 
where 
    wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n") 
    where 
     ls = lines input 
     ws = length words input 
     cs = length input 



wonderbox:ch01 manasapte$ runghc WC < quux.txt 
WC.hs:5:9: parse error on input ‘where’ 

मैं क्यों नहीं घोंसला मेरी wheres कर सकते हैं: http://book.realworldhaskell.org/read/getting-started.html मैं इस मुद्दे में आए ?

+0

असंबद्ध रूप से, 'इंटरैक्ट' वास्तव में कभी भी हास्केल में I/O करने का सही तरीका नहीं है। – dfeuer

+2

@ डीफ्यूअर: सरल के लिए 'इंटरैक्ट' का उपयोग करने में कुछ भी गलत नहीं है "मैं केवल उस हास्केल फ़ंक्शन को खोल में रखना चाहता हूं" - प्रोग्राम के बजाए। बेशक 'स्ट्रिंग' हमेशा अक्षम है, लेकिन ऐसे कई अनुप्रयोगों के लिए जो पूरी तरह से कोई फर्क नहीं पड़ता। – leftaroundabout

+3

@ डेफ्यूर मैं सहमत हूं, मैं इस अभ्यास को पुस्तक से मौजूदा बॉयलरप्लेट के साथ कर रहा हूं, मैं आपके पास हैकेल में थोड़े विशेषज्ञता स्तर तक नहीं पहुंच पाया है, लेकिन मैं अच्छी डिजाइन समझता हूं और ज्यादातर पुस्तक के बाद के चरणों में टिप्पणी के लिए "सही तरीका" धन्यवाद सीखें हालांकि – user1639848

उत्तर

7

चूंकि आपका दूसरा wherewordCount परिभाषा से जुड़ा हुआ है, इसलिए इसे उससे अधिक इंडेंट करने की आवश्यकता है। (। यद्यपि आप अभी भी कुछ अन्य त्रुटियों बाद में होगा)

+0

बहुत बहुत धन्यवाद, मैंने इसे ठीक किया – user1639848

2

खरोज गलत थी, तो यहाँ काम कर रहे संस्करण है:

-- test comment 
import Data.List 
main = interact wordCount 
    where wordCount input = unlines $ [concat $ intersperse " " (map show [ls, ws, cs])] 
      where ls = length $ lines input 
        ws = length $ words input 
        cs = length input 
5

दूसरों को पहले से ही जवाब दे दिया है। मैं बस कुछ और स्पष्टीकरण जोड़ूंगा।

थोड़ा सरल, हास्केल खरोज नियम है:

  • कुछ कीवर्ड बातें (where, let, do, case ... of) के एक ब्लॉक शुरू करते हैं।
  • ऐसे कीवर्ड के बाद पहला शब्द ढूंढें और इसके इंडेंटेशन को नोट करें। कॉलम नाम दें जो पिवट कॉलम होता है।
  • ब्लॉक में एक नई प्रविष्टि को परिभाषित करने के लिए बिल्कुल पिवट पर एक रेखा शुरू करें।
  • पिछली लाइनों में प्रविष्टि को जारी रखने के लिए पिवट के बाद एक रेखा शुरू करें।
  • ब्लॉक को समाप्त करने के लिए पिवट से पहले एक रेखा शुरू करें।

इसलिए,

where 
    wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n") 
    where 
     ls = lines input 
     ws = length words input 
     cs = length input 

असल

where { 
    wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n") 
    ; 
    where {  -- same column, new entry 
     ls = lines input 
     ; -- same column, new entry 
     ws = length words input 
     ; -- same column, new entry 
     cs = length input 
     } 
    } 

जो एक अलग परिभाषा wordCount से संबंधित नहीं के रूप में दूसरा where व्यवहार करता है मतलब है। अगर हम इसे और अधिक इंडेंट करते हैं:

where { 
    wordCount input = show (ls ++ " " ++ ws ++ " " ++ cs ++ "\n") 
     where {  -- after the pivot, same entry 
     ls = lines input 
     ; 
     ws = length words input 
     ; 
     cs = length input 
     } 
    } 
संबंधित मुद्दे