If statement SMLNJ if语句错误

If statement SMLNJ if语句错误,if-statement,sml,If Statement,Sml,我正在尝试学习SML,并编写了一个类似于下面代码中的小游戏,在REPL中运行良好,并使用MLTON编译良好。但是,它总是导致else语句(“Error!”)。如果我尝试用print(valOf(response))代替If语句调试它,它将返回我键入的任何字符串(如果我不键入任何内容,则返回空字符串)。所以我不认为它是inputLine函数,也不是let语句不返回stdin,也不应该是比较op fun first_room () = (print "You're in a dar

我正在尝试学习SML,并编写了一个类似于下面代码中的小游戏,在REPL中运行良好,并使用MLTON编译良好。但是,它总是导致else语句(“Error!”)。如果我尝试用
print(valOf(response))
代替If语句调试它,它将返回我键入的任何字符串(如果我不键入任何内容,则返回空字符串)。所以我不认为它是inputLine函数,也不是let语句不返回stdin,也不应该是比较op

fun first_room () =
    (print "You're in a dark, mottled room.\n";
     print "Which one do you choose? Left or Right?\n";
     print "> ";
     let val response = (TextIO.inputLine TextIO.stdIn)
     in
     if response = NONE
     then print "You stay.\n"
     else if valOf(response) = "Left"
     then print "You go left.\n"
     else if valOf(response) = "Right"
     then print "You go right.\n"
     else print "Error!\n"
     end)

fun main () = first_room ()
         
val _ = main ()
因此,我有两个问题: 1-什么原因可能导致这种情况? 2-这是构建此程序程序的ML(功能)方式吗

按照塞巴斯蒂安的回答: 仅告知普通读者:

在寻找调试此错误的方法时,我注意到如果我键入
TextIO.inputLine TextIO.stdIn并键入一些abc,我得到“abc\n”。我不知道可以使用REPL尝试ML程序而不编译它们。

这是什么原因?
TextIO.inputLine
返回的值包括尾随的换行符。也就是说,如果您写入
Left
并按enter键,实际上会得到字符串
“Left\n”
作为值返回

为了解决这个问题,您可以使用一个简单的修剪函数来删除换行符

(* trimLast : string -> string
   Trims off the last character in a string *)
fun trimLast s = String.substring(s, 0, size s - 1)
这是构建该程序的ML(功能)方法吗? 如果使用模式匹配,并将
选项
的处理从
输入行
返回的类型中分离出来,就可以大大简化编写
if
-表达式链的过程。我可能会这样写:

(* trimLast : string -> string
 * Trims off the last character in a string *)
    fun trimLast s = String.substring(s, 0, size s - 1)

fun processInput f =
    case TextIO.inputLine TextIO.stdIn of
        NONE   => print "Goodbye.\n"
      | SOME s => f (trimLast s)

(* empty room functions, to make the program compile *)
fun leftRoom () = ()
fun rightRoom () = ()

fun firstRoom () = (
    print "You're in a dark, mottled room.\n";
    print "Which one do you choose? Left or Right?\n";
    print "> ";
    processInput (fn
        "Left"   => ( print "You go left.\n"; leftRoom () )
      | "Right"  => ( print "You go right.\n"; rightRoom () )
      | _        => ( print "You do nothing.\n"; firstRoom () )
    )
  )
请注意我是如何创建函数
processInput
,它负责读取输入和处理选项值的。例如,这还允许您在一个位置规范化输入,例如,如果您想将其小写,则可以处理
“Left”
“Left”

此外,我还指定了将输入作为函数处理的规则,其中的模式与给定的字符串匹配


<>我会认为这种样式更具功能性和整洁。

起初我觉得它就像一个字符串选项类型的错误。我试图通过打印来调试这个,但没能捕捉到这个。在调试期间,我应该遵循什么一般规则才能检测到此类错误的原因?你对strong有什么建议吗?类型化语言?就我个人而言,我倾向于浏览程序,验证在某些程序点上的值是否与我期望的值相同(例如,通过打印),缩小问题发生的范围