我正在尝试从 stdin 读取一个字符串并将其刷新到 stdout 但我找不到标准的 ML 方式

I am trying to read a string from stdin and flush it out to stdout but I can't find a Standard ML way

注意:我完全是标准 ML 的新手。我只有基本的 F# 知识。

这是一个很好的 C 语言代码

#include <stdio.h>

int main()
{
  char str[100]; // size whatever you want

  scanf("%s", str);
  printf("%s\n", str);
  return 0;
}

现在,我想制作一个与此代码等效的标准 ML 版本。所以我尝试了这个:

val str = valOf (TextIO.inputLine TextIO.stdIn)
val _ = print str

但是我的 SML/NJ 是这样说的:

uncaught exception Option
 raised at: smlnj/init/pre-perv.sml:21.28-21.34

我谷歌了一下,我也搜索了这个网站,但我找不到任何不会导致错误的解决方案。

有人知道吗?

编辑:我试过这段代码:

fun main =
    let val str = valOf (TextIO.inputLine TextIO.stdIn)
    in
        case str
            of NONE => print "NONE\n"
            | _     => print str
    end

但也会报错:

stdIn:1.6-1.10 Error: can't find function arguments in clause
stdIn:4.9-6.33 Error: case object and rules don't agree [tycon mismatch]
  rule domain: 'Z option
  object: string
  in expression:
    (case str
      of NONE => print "NONE\n"
       | _ => print str)

这个答案几乎在下一个标记为 sml 的最新问题中给出:How to read string from user keyboard in SML language? -- 您可以将用户键盘替换为标准输入,因为标准输入是您使用终端与键盘交互的方式.

所以这段代码有两个问题:

fun main =
    let val str = valOf (TextIO.inputLine TextIO.stdIn)
    in
        case str
            of NONE => print "NONE\n"
            | _     => print str
    end

一个问题是如果你写 fun main 那么它必须接受参数,例如fun main () = ...() 部分不代表“无”,而是代表一件事,即 unit 值。

另一个问题是急切。 Option.valOf 函数在没有值时会崩溃,它会在你到达 case-of 之前执行此操作,使得 case-of 毫无意义。所以你可以做的是:

fun main () =
    case TextIO.inputLine TextIO.stdIn of
         SOME s => print s
       | NONE => print "NONE\n"

使用标准库可以缩短为:

fun main () =
    print (Option.getOpt (TextIO.inputLine TextIO.stdIn, "NONE\n"))

我鼓励你阅读How to read string from user keyboard in SML language?