验证Haskell中的地址的函数

时间:2014-05-22 17:44:57

标签: haskell

我制作了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

1 个答案:

答案 0 :(得分:2)

您遇到的问题只是"Ave."包含非字母字符,即'.',但all1(只是重新定义all)需要它履行checkStreetName。要解决此问题,例如测试all1 checkStreetName $ init xs而不是all1 checkStreetName xs