我制作了一个天气节目,它的本质非常简单:用户输入程序将工作的语言,城市和日期,然后我检查所有。但是,当用户输入正确的城市,但使用一个小字母时,程序会出现错误,尽管正确地输入了城市。
我现在是关于toLower函数的,但是我不能使用它,因为我得到了一对[(Text,Text)]类型的城市
let pairsOfCityNames = [ let names = T.splitOn (",") twoNames
[nameForHuman, nameForServer] = L.filter (not . T.null) (names)
in (nameForHuman, nameForServer)
| twoNames <- cityNames
]
(allNamesForHumans, _) = unzip pairsOfCityNames我得到了这样的东西:
[ ("Aragatsotn", "Aragatsotn")
, ("Ararat", "Ararat")
, ("Armavir", "Armavir")
, ("Dilijan", "Dilijan")
, ("Gegharkunik", "Gegharkunik")
, ("Gyumri", "Gyumri")
, ("Kotayk", "Kotayk")
, ("Shirak", "Shirak")
, ("Syunik", "Syunik")
, ("Vanadzor", "Vanadzor")
, ("Yerevan", "Yerevan")
]我希望当用户进入正确的城市,但用一个小字母,程序工作。
以及我是如何检查的:
cityFromUser <- TIO.getLine
let lovercaseForCity = T.toLower cityFromUser
cityNameForServer <- case L.lookup lovercaseForCity pairsOfCityNames of
Nothing -> do
TIO.putStrLn $ messageErrorWrongCity phrasesForUser
exitFailure
Just cityNameForServer -> return cityNameForServer
TIO.putStrLn cityNameForServer 发布于 2019-07-05 13:38:30
如果我理解正确的话,这个对列表的目的是将"ararat"转换为"Ararat",以弥补用户缺少标题大小写,而与您通信的服务器只接受给定城市名称的一个大写。
但我的理解可能是错的。
do cityFromUser <- T.toTitle <$> TIO.getLine
...因为您正在处理输入卫生问题,所以您可能还想从用户输入的内容中选择T.strip引导和尾随空格。使用T.toTitle,您可以使用服务器的有效城市名称的Data.Set代替成对的列表:
import Data.Set (Set)
import qualified Data.Set as Set
type CityName = Text
validCityNames :: Set CityName
validCityNames = Set.fromList
[ "Aragatsotn"
, "Ararat"
, "Armavir"
, "Dilijan"
, "Gegharkunik"
, "Gyumri"
, "Kotayk"
, "Shirak"
, "Syunik"
, "Vanadzor"
, "Yerevan"
, ...
]
getValidCityNameFromUser :: IO (Maybe CityName)
getValidCityNameFromUser = do
cityNameFromUser <- T.toTitle . T.strip <$> TIO.getLine
if Set.member cityNameFromUser validCityNames
then return (Just cityNameFromUser)
else do
TIO.putStrLn $ messageErrorWrongCity phrasesForUser
exitFailurehttps://stackoverflow.com/questions/56903126
复制相似问题