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

Functional programming 标准ML:基本转换为大写字符,functional-programming,sml,Functional Programming,Sml,我试图编写一个函数,将小写字符转换为大写字符(如果是大写,则保持不变) 以下是我写的: fun toUpper(myChar) = exception invalidCharacter; if ord(myChar) >= ord(#"A") andalso ord(myChar) <= ord(#"Z") then myChar else if ord(myChar) >= ord(#"a") andalso ord(myChar) &

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

以下是我写的:

fun toUpper(myChar) =
    exception invalidCharacter;
    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;
我不允许像以前那样在函数中定义异常吗

谢谢你的帮助,
b外行

否,您需要在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
无法从
invalidCharacter
异常中恢复,除非您处理所有异常(这通常是不好的做法):

相反,我们希望:

fun toUppers(str) =  
  String.implode (map toUpper (String.explode str)) handle invalidCharacter => (*do something*)
fun toUppers(str) = String.implode (map toUpper (String.explode str)) 
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*)