我有以下测试用例:
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 回答
另一种方法是将它全部打包在一个函数中,并使用包
Data.Char
中的函数ord
. 该函数将字符转换为十进制等效值 . 通过检查ascii表,您可以清楚地看到所需字符的边界 . 代码如下:您收到错误
Couldn't match type ‘Char’ with ‘[Char]’
,因为您尝试将elem
应用于_601332_,其类型为[Char]
,abc
也具有[Char]
类型,而elem
的类型签名为:所以在你的情况下你应该将它应用于
Char
和[Char]
:如果要检查
word
的所有字符是否为abc
的元素,可以使用函数Data.List.all执行以下操作:这将函数
flip elem abc
应用于word
中的每个字符,并在所有字符都是abc
的元素时返回True
.您还应该删除这两行:
因为你不需要第一个,第二个和第三个模式相同,所以它会使第三个模式匹配多余 . 而且还需要将
++ [' ']
添加到abc
的定义中,以使测试用例通过 .假设
ABC
是String
的同义词,则错误来自此处:elem
的类型签名为a -> [a] -> Bool
. 由于word
和abc
两者基本上都具有String
的类型,因此它不适合elem
的类型签名 .由于您要测试
word
的每个元素,因此这是一个解决方案:all
来自Prelude .EDIT: 另请注意
abc
含糊不清 . 它被定义为具有ABC
类型的常量,但它也是startState
的参数 . 删掉那个论点: