在 SML 中将字符串转换为 int

Converting a string to int in SML

在尝试为 SML 中的一种简单语言创建解释器时,我正在努力将字符串转换为整数。例如,

val someString = " 1.9"
Int.fromString someString

returns:

val it SOME 1 : int option

此外,当我尝试使用以下选项从选项类型中提取值时:

valOf(Int.fromString someString);

它returns:

val it = 1 : int

我很困惑为什么它仍然将字符串转换为这个整数,即使它是一个实数。以及如何将字符串转换为 int 并处理错误(如果有)。

我不知道每个实现中的转换是如何工作的,但是在 Poly/ML 中,如果到目前为止已经读取了一个有效的 int,则有效的 int 将是 returned - 即使整个字符串不是有效的整数。

正如 molbdnilo 指出的那样,使用 Char.isDigit 函数(或您自己允许更多 int 情况的函数)检查字符串是否为 int 会更容易:

List.all Char.isDigit (String.explode someString)

关于您对 valOf 的混淆,这是完全可以预料的,因为您已经看到 Int.fromString 返回了一个 int 选项。 valOf函数定义如下:

fun valOf (opt: 'a option) : 'a =
    case opt of
        NONE => raise Fail "option is NONE"
      | SOME a => a

所以既然你看到 Int.fromString " 1.9" 返回了 SOME 1,它 必须 valOf (Int.fromString " 1.9") returns 1.