0

私は 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 プログラムを試すことができるとは知りませんでした。

4

1 に答える 1