我试图编写一个将小写字符转换为大写的函数(如果大写,则保持不变)。
这是我写的:
Ullman.sml:66.12 Error: syntax error: inserting EQUALOP
uncaught exception Compile [Compile: "syntax error"]
raised at: ../compiler/Parse/main/smlfile.sml:15.24-15.46
../compiler/TopLevel/interact/evalloop.sml:44.55
../compiler/TopLevel/interact/evalloop.sml:292.17-292.20
我收到此编译错误:
if statement
我不允许在功能中定义异常吗?
感谢您的帮助, bclayman
答案 0 :(得分:2)
不,您需要在let表达式中定义异常,例如:
fun toUpper(myChar) =
let exception invalidCharacter;
in if ord(myChar) >= ord(#"A") andalso ord(myChar) <= ord(#"Z") then myChar
else
if ord(myChar) >= ord(#"a") andalso ord(myChar) <= ord(#"z") then
chr(ord(myChar) - (ord(#"a") - ord(#"A")))
else raise invalidCharacter
end
也就是说,在let表达式之外定义异常可能是更好的做法,这样它就可以被用户捕获。例如,如果您想对字符串执行此操作,可以执行以下操作:
fun toUppers(str) = String.implode (map toUpper (String.explode str))
除非您处理所有异常(这通常是不好的做法),否则无法从invalidCharacter
异常中恢复:
fun toUppers(str) =
String.implode (map toUpper (String.explode str)) handle e => (*do something*)
相反,我们希望:
fun toUppers(str) =
String.implode (map toUpper (String.explode str)) handle invalidCharacter => (*do something*)