私は SML を学ぼうとしていて、Zed Shaw の本「Learn Ruby The Hard Way」に似た小さなゲームを書きました。以下のコードは、REPL で問題なく動作し、MLTON で適切にコンパイルされます。ただし、常に else ステートメント (「エラー!」) が発生します。if ステートメントの代わりにデバッグしようとするとprint(valOf(response))
、入力した文字列が返されます (何も入力しない場合は空の文字列)。したがって、inputLine 関数ではないと思います。また、let ステートメントが stdin を返さないということでもありません。また、比較演算であってはなりません。
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 ()
そこで、2 つの質問があります。1 - 何が原因でしょうか? 2 - これは、この手続き型プログラムを構築するための ML (機能的) 方法ですか?
セバスチャンの答えに続いて:
カジュアルな読者にお知らせするだけです:
このエラーをデバッグする方法を探していたところTextIO.inputLine TextIO.stdIn;
、REPL を入力して abc を入力すると、"abc\n" が返されることに気付きました。REPL を使用して、コンパイルせずに ML プログラムを試すことができるとは知りませんでした。