sml - 我正在尝试从标准输入读取字符串并将其刷新到标准输出,但我找不到标准 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)
解决方案
这个答案几乎在下一个最近标记为 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 语言从用户键盘读取字符串?
推荐阅读
- c++ - 文件太大其他选项
- python - 比较两个大的 csv 文件需要很长时间
- python - TensorFlow : c++ 自定义 op 官方示例 zero_out : 错误
- vue.js - 为什么 v-slot 在单个文件中不起作用?
- spring-boot - Spring Cloud Gateway 自定义网关过滤器不起作用
- javascript - RegEx JavaScript 替换等号后跟一个新行
- visual-studio-code - 如何仅更改侧边栏的主题?
- python - 如何在一台机器上运行 gRPC 客户端,在另一台机器上运行 gRPC 服务器?
- django - 序列化具有多对多字段的嵌套 Django 模型
- python - 如何提取 DataCompy 比较结果?