首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何转换[(Data.Text.Internal.Text,Data.Text.Internal.Text)] ->文本

如何转换[(Data.Text.Internal.Text,Data.Text.Internal.Text)] ->文本
EN

Stack Overflow用户
提问于 2019-07-05 12:31:55
回答 1查看 77关注 0票数 0

我制作了一个天气节目,它的本质非常简单:用户输入程序将工作的语言,城市和日期,然后我检查所有。但是,当用户输入正确的城市,但使用一个小字母时,程序会出现错误,尽管正确地输入了城市。

我现在是关于toLower函数的,但是我不能使用它,因为我得到了一对[(Text,Text)]类型的城市

代码语言:javascript
复制
    let pairsOfCityNames  = [ let names = T.splitOn (",") twoNames
                                    [nameForHuman, nameForServer] = L.filter (not . T.null) (names)
                               in (nameForHuman, nameForServer)
                             | twoNames <- cityNames 
                             ]
          (allNamesForHumans, _) = unzip pairsOfCityNames

我得到了这样的东西:

代码语言:javascript
复制
[ ("Aragatsotn", "Aragatsotn")
, ("Ararat", "Ararat")
, ("Armavir", "Armavir")
, ("Dilijan", "Dilijan")
, ("Gegharkunik", "Gegharkunik")
, ("Gyumri", "Gyumri")
, ("Kotayk", "Kotayk")
, ("Shirak", "Shirak")
, ("Syunik", "Syunik")
, ("Vanadzor", "Vanadzor")
, ("Yerevan", "Yerevan")
]

我希望当用户进入正确的城市,但用一个小字母,程序工作。

以及我是如何检查的:

代码语言:javascript
复制
  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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-05 13:38:30

如果我理解正确的话,这个对列表的目的是将"ararat"转换为"Ararat",以弥补用户缺少标题大小写,而与您通信的服务器只接受给定城市名称的一个大写。

但我的理解可能是错的。

你可以用Data.Text.toTitle

代码语言:javascript
复制
do cityFromUser <- T.toTitle <$> TIO.getLine
   ...

因为您正在处理输入卫生问题,所以您可能还想从用户输入的内容中选择T.strip引导和尾随空格。使用T.toTitle,您可以使用服务器的有效城市名称的Data.Set代替成对的列表:

代码语言:javascript
复制
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
      exitFailure
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56903126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档