2012-05-19 91 views
0

您好,我得到一個(第7行)輸入「=」解析錯誤,這只是在字符串中的單詞求和,任何幫助表示讚賞。謝謝。解析錯誤輸入「=」

module Main where 

main = do 
putStr "Enter a string: " 
input <- getContents 

value = unwords . sum . words input 
putStrLn (value) 
+1

如果在值的前面寫「let」,則語法錯誤將消失,您可以繼續處理類型錯誤。對於我來說,對於任何舊字符串中的字詞進行總結意味着什麼意義,或者爲什麼人們可以明智地「拒絕」這樣做的結果對我來說並不明顯。你能舉一個你想要發生什麼的例子嗎? – pigworker

+0

啊我在使用單詞大部分時間使用單詞後會感到困惑。我希望發生的事情是輸入爲例如「這是一個字符串」,單詞將其分割爲[「this」,「is」,「a」,「string」],然後sum會計算這些值並將其值存儲起來,然後打印。總結這是正確的功能?乾杯。 – user1405440

+1

不,'sum'計算一列數字的總和。如果要計算單詞的數量,可以使用'length'來獲取列表的長度,然後使用'show'從長度中創建一個字符串。或者你可以使用'print'而不是'putStrLn'來顯示一個數字。 – pigworker

回答

4

行:

value = unwords . sum . words input 

在語法上不合法。你需要一個let語句。

let value = unwords . sum . words input 

這仍然是無效的,要應用的功能(當然,三大功能組成)來輸入:

let value = (unwords . sum . words) input 

或者是:

let value = unwords . sum . words $ input 

這仍然無效,因爲輸入是String,而words的結果是String[String])的列表。因此,您需要將字符串讀入Num類型(Integer s?),然後再轉換回Stringunwords是沒有用的,因爲你只有一個字,總和,留底(相對於單詞的列表,其中unwords需要):

let value = show . sum . map read. words $ input 

根據不同的類型,你可能想註釋讀或總和來指定它是否是IntDouble或其他。

+0

謝謝!我不完全確定閱讀是如何工作的,爲什麼你需要將閱讀映射到字符串列表,你能解釋一下嗎? – user1405440

+1

那麼,你不能總結一個字符串列表,因爲你不能添加字符串。 –

+0

你對pigworker的評論建議你正在尋找'length'。我以爲你想要一個數字列表的總和 - 「sum」會加上一個數字列表。 'read'接受一個字符串並將其轉換爲一個數字('map read'只對數組列表中的字符串執行相同的操作)。 –