我是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
当输入包含大写字母时,它应该返回异常消息。 并在小写或任何其他字符时返回输入。 有人可能会建议一个更好的写作方式吗?
答案 0 :(得分:3)
当输入包含大写字母时,它应该返回异常消息。并在小写或任何其他字符时返回输入。有人可能会建议一个更好的写作方式吗?
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.Except
和MonadThrow/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"