2015-08-29 26 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

相关问题