在SML中将字符串转换为int

在SML中将字符串转换为int,sml,Sml,在尝试用SML为简单语言创建解释器时,我正在努力将字符串转换为整数。比如说, val someString = " 1.9" Int.fromString someString 返回: val it SOME 1 : int option 此外,当我尝试使用以下方法从选项类型提取值时: valOf(Int.fromString someString); 它返回: val it=1:int 我很困惑为什么它仍然将字符串转换成这个整数,即使它是一个实数。如何将字符串转换为int并处理错误(如果

在尝试用SML为简单语言创建解释器时,我正在努力将字符串转换为整数。比如说,

val someString = " 1.9"
Int.fromString someString
返回:

val it SOME 1 : int option
此外,当我尝试使用以下方法从选项类型提取值时:

valOf(Int.fromString someString);
它返回:

val it=1:int


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

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

正如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”)
返回
1

如果字符串以整数开头,此文档可能会帮助您
fromString
成功。您可能想编写自己的转换器,检查字符串中的每个字符是否都是数字。