我正在尝试从 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?
注意:我完全是标准 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?