使用递归检查字符串是否包含某个字符

时间:2015-08-29 00:21:54

标签: haskell recursion

我知道如何检查字符串是否包含这样的特定字符:

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

现在,我怎样才能使用递归相同的方法?

另外,使用模式匹配来检查其中一个参数是否为空,我正在

解析错误在模式中:' ' 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

1 个答案:

答案 0 :(得分:4)

我们可以保持相同的签名,因为该功能可以做同样的事情。

class giraffemousehandler extends MouseAdapter implements MouseListener, MouseMotionListener { //MouseAdapter makes it so that you don't have to have all 7 implemented mouse listener methods

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        status.setBounds(e.getX(), e.getY(), 50, 60); //Makes JLabel follow mouse

    }

    @Override
    public void mouseEntered(MouseEvent e) {

        status.setText("Entered");

    }

    @Override
    public void mouseExited(MouseEvent e) {

        status.setText("exited");
        // status.setBounds(e.getX(), e.getY(), 5, 6);

    }

}
}

当你执行递归时,你总是想确保你考虑你的基本情况,在这种情况下,当你在空字符串中寻找一个字符时,显然总是返回false。

charFound :: Char -> String -> Bool

现在你必须考虑另一种情况,即String不为空。如果字符串不为空,则其形式为charFound c "" = False ,如果x等于我们的字符,则返回true,否则我们检查c是否在xs中。

(x:xs)

可替换地,

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

编辑: 要回答有关模式匹配的其他问题,您会收到该警告,因为charFound c (x:xs) = c == x || charFound c xs 不是字符!角色永远不会是空的,所以你不需要考虑这种可能性。 此外,您绝对可以使用''来匹配不是列表的内容。您可以使用_来匹配您喜欢的任何参数。例如,基本案例可以写成

_

因为当String为空时我们实际上不需要知道字符的值是什么,所以我们不需要给它起一个名字。