String 检查字符串是否包含大写字母
我是Haskell的新手,似乎无法正确编写代码 我试过: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
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()
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()
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
,但你不会写,是吗?;-)