首页 > 解决方案 > 我正在尝试从标准输入读取字符串并将其刷新到标准输出,但我找不到标准 ML 方式

问题描述

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

标签: smlsmlnjml

解决方案


这个答案几乎在下一个最近标记为 sml 的问题中给出:如何以 SML 语言从用户键盘读取字符串?-- 你可以用标准输入替换用户键盘,因为标准输入是你使用终端与键盘交互的方式。

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

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 () = .... 该()部分不代表“无”,而是完全代表一件事,即单位价值。

另一个问题是渴望。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"))

我鼓励您阅读如何以 SML 语言从用户键盘读取字符串?


推荐阅读