首页 文章

检查字符串是否包含非字母字符

提问于
浏览
0

我有以下测试用例:

abc :: ABC 
abc = ['A'..'Z'] ++ ['a'..'z']

startState :: ABC -> String -> Maybe (String, [Char], [Char])
startState abc "Save Our Souls"  == Just ("SAVE OUR SOULS", "", "")
startState abc "Save Our Souls!" == Nothing

简而言之,如果字符串包含不属于abc的字符(在示例中,第三行包含!),则该函数应该不打印任何内容,否则它应该像示例中那样打印字符串 .

这是我的代码:

startState :: ABC -> String -> Maybe (String, [Char], [Char])
startState abc "" = Just ("","","")
startState abc word = Just (word,"","")
startState abc word
 | word `elem` abc   = Just (word,"","")
 | otherwise         = Nothing

我收到错误: Couldn't match type Char' with [Char]'

3 回答

  • 1

    另一种方法是将它全部打包在一个函数中,并使用包 Data.Char 中的函数 ord . 该函数将字符转换为十进制等效值 . 通过检查ascii表,您可以清楚地看到所需字符的边界 . 代码如下:

    conv :: String -> String
    conv (x:xs) 
        | ord >= 65 && ord x <= 91  = [x] ++ conv xs
        | ord >= 97 && ord x <= 122 = [x] ++ conv xs
        | otherwise                 = "" ++ conv xs
    
  • 0

    您收到错误 Couldn't match type ‘Char’ with ‘[Char]’ ,因为您尝试将 elem 应用于_601332_,其类型为 [Char]abc 也具有 [Char] 类型,而 elem 的类型签名为:

    elem :: (Foldable t, Eq a) => a -> t a -> Bool
    

    所以在你的情况下你应该将它应用于 Char[Char]

    elem :: Char -> [Char] -> Bool
    

    如果要检查 word 的所有字符是否为 abc 的元素,可以使用函数Data.List.all执行以下操作:

    startState abc word
      | all (flip elem abc) word   = Just (word,"","")
      | otherwise                  = Nothing
    

    这将函数 flip elem abc 应用于 word 中的每个字符,并在所有字符都是 abc 的元素时返回 True .

    您还应该删除这两行:

    startState abc "" = Just ("","","")
    startState abc word = Just (word,"","")
    

    因为你不需要第一个,第二个和第三个模式相同,所以它会使第三个模式匹配多余 . 而且还需要将 ++ [' '] 添加到 abc 的定义中,以使测试用例通过 .

  • 2

    假设 ABCString 的同义词,则错误来自此处:

    | word `elem` abc   = Just (word,"","")
    

    elem 的类型签名为 a -> [a] -> Bool . 由于 wordabc 两者基本上都具有 String 的类型,因此它不适合 elem 的类型签名 .

    由于您要测试 word 的每个元素,因此这是一个解决方案:

    | all (`elem` abc) word = Just (word,"","")
    

    all 来自Prelude .

    EDIT: 另请注意 abc 含糊不清 . 它被定义为具有 ABC 类型的常量,但它也是 startState 的参数 . 删掉那个论点:

    abc :: ABC
    abc = ['A'..'Z'] ++ ['a'..'z']
    
    startState :: String -> Maybe (String, [Char], [Char])
    startState "" = Just ("","","")
    startState word
     | word `elem` abc   = Just (word,"","")
     | otherwise         = Nothing
    

相关问题