【发布时间】: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 => expr1 | case2 => expr2 | ... -
@molbdnilo 感谢您的建议,但我仍然无法获得线索。我编辑了原始帖子。