2015-10-04 23 views
0

我正在做一些Haskell練習,但無法解決最後一個問題。從字符串中取出所有數字並將它們呈現在列表中

我需要遞歸定義已在Data.Char模塊中定義的函數。

最後一個函數我需要定義是這種類型的:

nums :: String -> [Int] 

這裏是(翻譯)問題:

從Data.Char模塊使用的功能,定義遞歸以下函數:

(c)nums :: String - > [Int]它接收到一個字符串,並輸出一個列表 與該字符串上發生的algarisms,按相同的順序。

--This is my code 

numbers :: String -> [Int] 
numbers [] = [] 
numbers (l:ls) = if ord l >= 48 && ord l <= 57 
       then l : (numbers ls) 
       else (numbers ls) 

我已經得到的解釋此錯誤:

pratica3.hs:137:14: 
    Couldn't match expected type `Int' with actual type `Char' 
    In the first argument of `(:)', namely `l' 
    In the expression: l : (numbers ls) 
    In the expression: 
     if ord l >= 48 && ord l <= 57 then 
      l : (numbers ls) 
     else 
      (numbers ls) 
Failed, modules loaded: none. 

謝謝。

+4

你只是在進行過濾,但當你把它放在'數字ls'中時'l'仍然是一個'Char'。您需要將'l'轉換爲'Int'。 –

+1

您可以直接比較「字符」,例如'l'='0'&& l <='9',沒有必要在那裏將它們轉換爲'Int'。在構建「Int」列表之前,您必須先轉換它們。此外,您的代碼僅會生成一位數字的列表。例如。它永遠不會包含123,只有1,2,3。這是打算嗎? – chi

+0

可能是你想要將字符串分解爲'words',並通過'read'的某些實現將它們轉換爲數字('map')? – jakubdaniel

回答

0

好吧,

解決的辦法是:

numbers :: String -> [Int] 
numbers [] = [] 
numbers (l:ls) = if ord l >= 48 && ord l <= 57 
    then (ord l - 48): (numbers ls) 
    else (numbers ls) 

這解決了我的問題,這是(現在我會試着更好地解釋它):

從使用功能Data.Char模塊,遞歸定義以下函數:

(c)nums :: String - > [Int]它接收一個字符串,並輸出一個列表 與該字符串上發生的algarisms,按相同的順序。

請記住,這是爲與Haskell語言接觸少於8小時且使用任何其他語言爲0的學生製作的。

如果這是不正確的,我將不勝感激任何答案。我想學習。

注意:此解決方案似乎並不是最完整的。唉,它是爲剛剛開始學習Haskell的學生製作的,不知道如何使用單詞和地圖功能。

+2

這不是一個合適的答案。我意識到這是你的問題,但首先,刪除「謝謝你!」消息,其次,解釋爲什麼以及如何解決您遇到的問題。請編輯它。 – AJFarmar

+0

@AJFarmar \t 首先我很抱歉。第二,我明白我在說話的方式比我更懂,他們可能知道解決這個問題的方法有數千種。我是這樣說的,因爲我不知道對於我總共4個小時課程的問題還有另一個答案,我真的想更多地描述它,並使其「不會誤導」,但我能做的最好的就是翻譯這個問題。我不明白Emacs用戶的答案,儘可能多。 –

+2

這不是寫作和發佈違揹回答指南的答案的藉口。你已經改善了你的答案,所以我現在已經投了票,但請記住,我沒有侮辱你。我完全知道你沒有經驗,但這裏的答案必須寫入一定的標準。請參閱[本頁](http://stackoverflow.com/help/how-to-answer)。 – AJFarmar

2

由於這是一個類問題,下面是一些提示。使用函數words首先將字符串分解爲單獨的元素,刪除所有非數字字符,然後爲您的字符串的每個元素輸入read "elem":Int,並過濾掉那些返回false的字符。剩下的將是[Int]

很明顯的神奇之處在於read函數接受數字的char表示並將它們轉換爲Int。如果您的號碼非常大,請考慮使用read "elem":Integer變體。

+0

@ C.Rib,您的解決方案不完整或您的問題具有誤導性。修復一個或另一個。 –

相關問題