标准ML:基本转换为大写字符

时间:2015-07-27 13:55:59

标签: functional-programming sml

我试图编写一个将小写字符转换为大写的函数(如果大写,则保持不变)。

这是我写的:

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

1 个答案:

答案 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*)