我制作了3个功能,每个功能都完美无缺:
checkNumber - 检查字符串是否只包含数字
checkStreetName - 检查字符串是否只包含字母
isAbbreviation - 检查字符串是否为“Ave.”或“圣。”
我创建了使用其他函数的函数checkAdd
函数checkAdd获取字符串列表,如果出现以下情况应返回True:
第一个字符串只包含数字
最后一个字符串=“Ave”。或圣。“
,其间的其余字符串应包含字母
例如:[“123”,“asdd”,“Ave。”]是合法地址
然而,我变得虚假而不是真实,我不知道为什么。我单独检查了每个功能。 (顺便说一下,我并没有大声使用Haskell中的一些现成功能)
所以对于这个输入:[“123”,“asdd”,“Ave.”]我弄错了。为什么?
我还必须说奇怪的是,当我在checkAdd中保留2个条件而不是3个时,它工作正常
checkNumber:: String->Bool
checkNumber xs =((length(filter isDigit xs ))== length(xs))
checkStreetName:: String->Bool
checkStreetName xs =((length(filter isLetter1 xs ))== length(xs))
isLetter1:: Char->Bool
isLetter1 ch =((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
checkAdd :: [String]->Bool
checkAdd (num:xs) = (checkNumber num && (all1 checkStreetName (tail xs)) && isAbbreviation (last1 xs))
all1 :: (String->Bool)->[String] -> Bool
all1 f xs = ((length(filter f xs)) == length(xs))
isAbbreviation:: String->Bool
isAbbreviation str |str=="Ave." || str=="St." =True
|otherwise =False
last1 :: [a]->a
last1 (x:[]) = x
last1 (x:xs) =last1 xs
答案 0 :(得分:2)
您遇到的问题只是"Ave."
包含非字母字符,即'.'
,但all1
(只是重新定义all
)需要它履行checkStreetName
。要解决此问题,例如测试all1 checkStreetName $ init xs
而不是all1 checkStreetName xs
。