2015-08-29 54 views
-2

我知道如何檢查是否字符串包含特定字符像這樣的一個人物:檢查一個字符串包含使用遞歸

charFound :: Char -> String -> Bool 
charFound c s = c `elem` s 

現在,我怎麼可能有使用遞歸同樣的辦法?

此外,使用模式匹配檢查,如果其中一個參數是空的,我越來越

分析錯誤圖案:'的

charFound:: Char->String->Bool 
charFound '' s = error "Something is empty." -- ERROR 
charFound c "" = error "Something is empty." -- OK 

我可以在使用_忽略一個不是列表的東西的參數?

更新目前代碼

charFound :: Char->String->Bool 
charFound c (x:xs) 
    | c == x = True 
    | xs == "" = False 
    | otherwise = contido c xs 

而且

charFound :: Char->String->Bool 
charFound _ "" = False -- returns false if I type > charFound 'a' "Leh" 
charFound c (x:xs) 
    | c == x = True 
    | otherwise = contido c xs 
+0

'elem'是一個遞歸函數。你可以嘗試實現它,或者檢查文檔是如何實現的。 – duplode

+0

來自LearnYouaHaskell.com:遞歸實際上是一種定義函數的方法,其中函數應用於其自己的定義中 – PlayHardGoPro

+0

您錯過了空列表模式匹配,而是對空列表中的空列表進行了一次有趣的短信測試非空案件。 – dfeuer

回答

4

我們可以保持相同的簽名,因爲函數做同樣的事情。

charFound :: Char -> String -> Bool 

當你執行你總是要確保你認爲你的基本情況遞歸,在這種情況下,它會當你正在尋找一個空字符串的字符,這顯然應該總是返回false是。

charFound c "" = False 

現在,您必須考慮另一種情況,其中字符串不爲空。如果字符串不爲空,則它的形式爲(x:xs),如果x等於我們的字符,則返回true,否則我們檢查c是否在xs中。

charFound c (x:xs) 
    | c == x = True 
    | otherwise = charFound c xs 

另外,

charFound c (x:xs) = c == x || charFound c xs 

編輯: 要獲得關於模式匹配的其他問題,您獲得的警告,因爲''不是字符!角色永遠不會是空的,所以你不需要考慮這種可能性。 另外,您絕對可以使用_來匹配不是列表的內容。您可以使用_來匹配您喜歡的任何參數。例如,基本情況本來可以寫成

charFound _ "" = False 

因爲我們實際上並不需要知道字符的值是什麼,當字符串是空的,所以我們並不需要給它一個名稱。

+0

謝謝你。我添加了一個關於模式匹配的東西。你能舉手嗎? – PlayHardGoPro

+0

我的編輯能夠回答你的問題嗎? – JHobern

+0

幾乎完美。但是當我輸入空字符串時,我得到「異常:t4.hs:(26,1) - (28,29):函數charFound中的非窮舉模式」 – PlayHardGoPro

相關問題