检查字符串是否包含大写

时间:2015-12-09 10:50:57

标签: string haskell

我是Haskell的新手,我似乎无法正确编写代码。

我试过了:

identifier :: String -> String
identifier input
    | isUpper input == True = putStrLn("*** Exception: Uppercase" ++ input)
    | return input

我最近的尝试是:

identifier :: String -> String
identifier input = do
    if isUpper input == True
        then putStrLn("*** Exception : Uppercase" ++ input)
        else return input

当输入包含大写字母时,它应该返回异常消息。 并在小写或任何其他字符时返回输入。 有人可能会建议一个更好的写作方式吗?

2 个答案:

答案 0 :(得分:3)

  

当输入包含大写字母时,它应该返回异常消息。并在小写或任何其他字符时返回输入。有人可能会建议一个更好的写作方式吗?

  • 避免在编写异常时产生异常并产生副作用的函数purely
  • putStrLn ("*** Exception: ...")不会产生异常。 error "Uppercase"会。

如果您的函数具有签名String -> String,则不能

  • 在输入中使用isUpper,因为Data.Char.isUpper :: Char -> Bool
  • 使用putStrLn作为输出,因为System.IO.putStrLn :: String -> IO ()

如果有效标识符的唯一标准是它不包含大写的latter,您可以写:

isIdentifier :: String -> Bool
isIdentifier = not . any isUpper

尽管您可能希望将有效标识符的所有条件制定为一个谓词。例如,可以匹配 [_ a-z] [_ a-zA-Z0-9] + 之类的东西:

isIdentifier :: String -> Bool
isIdentifier (c:cs) = (c == '_' || isLower c) && all (\c -> c == '_' || isAlphaNum c) cs
isIdentifier "" = False

答案 1 :(得分:3)

如果你想包括"正常"输入/输出你必须使你的功能

identifier :: String -> IO String

否则(即使编写不安全的函数不是一个好习惯)我建议使用error "*** Exception …"(如果你想使用真实的例外情况,请查看Control.ExceptMonadThrow/MonadCatch

next - 我认为isUpper是从Data.Char导入的,只适用于字符。我将isUpper与函数all结合起来,该函数检查列表的所有元素的属性(此处为isUpper)是否为真 - 可以应用于String as它只是[Char]的同义词。我还建议不要检查大写但小写,因为这是你的目标。

所以你可以拥有像

这样的东西
if (all isLower input)
  then input
  else error "i will promise to look at Data.Maybe and Data.Either in the near future"