If statement SMLNJ if语句错误
我正在尝试学习SML,并编写了一个类似于下面代码中的小游戏,在REPL中运行良好,并使用MLTON编译良好。但是,它总是导致else语句(“Error!”)。如果我尝试用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
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在REPL中编码>并键入一些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有什么建议吗?类型化语言?就我个人而言,我倾向于浏览程序,验证在某些程序点上的值是否与我期望的值相同(例如,通过打印),缩小问题发生的范围