String 检查字符串是否包含大写字母

String 检查字符串是否包含大写字母,string,haskell,String,Haskell,我是Haskell的新手,似乎无法正确编写代码 我试过: identifier :: String -> String identifier input | isUpper input == True = putStrLn("*** Exception: Uppercase" ++ input) | return input 我最近的尝试是: identifier :: String -> String identifier input = do if is

我是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
当输入包含大写字母时,它应返回异常消息。 并在输入为小写或任何其他字符时返回该输入。 有人能提出一个更好的写作方法吗

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

  • 避免在可以编写异常时抛出异常并产生副作用的函数
  • putStrLn(“***异常:…”)
    不会产生异常<代码>错误“大写”将出现
如果函数具有签名
String->String
,则它不能

  • 对输入使用
    isUpper
    ,因为
    Data.Char.isUpper::Char->Bool
    ,或者
  • 使用
    putStrLn
    作为输出,因为
    System.IO.putStrLn::String->IO()
如果有效标识符的唯一标准是不包含大写字母latters,则可以编写:

isIdentifier :: String -> Bool
isIdentifier = not . any isUpper
尽管您可能希望将有效标识符的所有条件表述为一个谓词。例如,它可以匹配类似[_a-z][_a-zA-Z0-9]+:

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

  • 避免在可以编写异常时抛出异常并产生副作用的函数
  • putStrLn(“***异常:…”)
    不会产生异常<代码>错误“大写”将出现
如果函数具有签名
String->String
,则它不能

  • 对输入使用
    isUpper
    ,因为
    Data.Char.isUpper::Char->Bool
    ,或者
  • 使用
    putStrLn
    作为输出,因为
    System.IO.putStrLn::String->IO()
如果有效标识符的唯一标准是不包含大写字母latters,则可以编写:

isIdentifier :: String -> Bool
isIdentifier = not . any isUpper
尽管您可能希望将有效标识符的所有条件表述为一个谓词。例如,它可以匹配类似[_a-z][_a-zA-Z0-9]+:

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

identifier :: String -> IO String
否则(即使编写不安全函数不是一个好习惯),我建议使用
错误“***异常…”
(如果要使用真正的异常,请查看
控件。除了
MonadThrow/MonadCatch

接下来-我假设
isUpper
是从
Data.Char
导入的,并且只对字符起作用。我会将
isUpper
与检查属性(此处
isUpper
)的函数
all
结合使用对于列表的所有元素都是如此-可以应用于
字符串
,因为它只是
[Char]
的同义词。我还建议不要检查大写字母,而是小写字母,因为这是您的目标

所以你可以吃点类似的东西

if (all isLower input)
  then input
  else error "i will promise to look at Data.Maybe and Data.Either in the near future"
如果你想包括“正常”输入/输出,你必须使你的功能

identifier :: String -> IO String
否则(即使编写不安全函数不是一个好习惯),我建议使用
错误“***异常…”
(如果要使用真正的异常,请查看
控件。除了
MonadThrow/MonadCatch

接下来-我假设
isUpper
是从
Data.Char
导入的,并且只对字符起作用。我会将
isUpper
与检查属性(此处
isUpper
)的函数
all
结合使用对于列表的所有元素都是如此-可以应用于
字符串
,因为它只是
[Char]
的同义词。我还建议不要检查大写字母,而是小写字母,因为这是您的目标

所以你可以吃点类似的东西

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

我认为您的
identifier
函数只检查
字符串的第一个字母,而不检查其他字母-因此它不会为“d'Artagnan”生成正确的结果。我认为您应该递归调用
isIdentifier
或使用
折叠
我认为您的
标识符
函数只检查
字符串的第一个字母
,而不检查其他字母-因此它不会为“d'Artagnan”生成正确的结果。我认为你应该递归调用
isIdentifier
,或者使用
折叠式的注释:没有必要写
something==True
,因为这相当于简单的
something
。它也相当于
(something==True==True
,但你不会写,对吗?;-)风格注释:没有必要写
something==True
,因为这相当于简单的
something
。它也相当于
(something==True==True
,但你不会写,是吗?;-)