簡體   English   中英

驗證Haskell中的地址的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM