[英]function that validates an address in Haskell
我做了3個函數,每個函數都能很好地工作:
checkNumber-檢查字符串是否僅包含數字
checkStreetName-檢查字符串是否僅包含字母
isAbbreviation-檢查字符串是否為“ Ave”。 或“聖”
我做了使用其他功能的功能checkAdd
函數checkAdd獲取字符串列表,如果滿足以下條件,則應返回True:
第一個字符串僅包含數字
最后一個字符串=“ Ave。” 或聖。”
中間的其余字符串應包含字母
例如:[“ 123”,“ asdd”,“ Ave。”]是合法地址
但是,我越來越虛假,而不是真實,我也不知道為什么。 我單獨檢查了每個功能。 (順便說一句,我不大聲使用Haskell中的一些現成函數)
因此對於此輸入:[“ 123”,“ asdd”,“ Ave.”]我得到了false。 為什么呢?
我還必須說,奇怪的是,當我在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
您遇到的問題就是"Ave."
包含一個非字母字符,即'.'
但是all1
(只是對all
的重新定義)要求它滿足checkStreetName
。 為了解決這個問題,例如測試all1 checkStreetName $ init xs
而不是all1 checkStreetName xs
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.