【问题标题】: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 方式
【发布时间】:2020-10-14 20:16:17
【问题描述】:

注意:我完全是标准 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)

【问题讨论】:

  • 您假设 TextIO.inputLine 没有返回 NONE,但它确实返回了。
  • @molbdnilo 哦,那我该怎么办?
  • 使用模式匹配来检查结果,就像在 F# 中一样。
  • 模式匹配比F#更方便; case expression of case1 =&gt; expr1 | case2 =&gt; expr2 | ...
  • @molbdnilo 感谢您的建议,但我仍然无法获得线索。我编辑了原始帖子。

标签: sml smlnj ml


【解决方案1】:

这个答案几乎在下一个标记为 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?

【讨论】:

  • 哦,谢谢!真的很有帮助。
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 2012-09-25
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多