英文:
In this SML code I'm trying to open a file selected by the user but I keep getting a tycon mismatch error
问题
你的代码存在一个类型不匹配(tycon mismatch)的问题。问题发生在 openAndHandleFile
函数中。在这里,你需要处理 TextIO.openIn fileName
的返回值,它返回一个 TextIO.instream option
类型的值。但是你的 readAndPrintLine
函数期望的参数是一个 TextIO.instream
类型。
为了解决这个问题,你可以使用模式匹配来处理 TextIO.openIn fileName
的返回值,并分别处理 NONE
和 SOME instream
的情况。这样,你可以根据是否成功打开文件来调用适当的函数。
以下是修改后的代码:
fun openAndHandleFile fileName =
case TextIO.openIn fileName of
NONE => print ("Error: Failed to open the file " ^ fileName ^ ".\n")
| SOME instream => readAndPrintLine instream
fun read_file () = let
val _ = print "Please enter a filename to be parsed: \n"
val fileNameOpt = TextIO.inputLine TextIO.stdIn
in
case fileNameOpt of
NONE => print "No filename provided.\n"
| SOME fileName => openAndHandleFile fileName
end
(* 调用 read_file 函数启动程序 *)
val _ = read_file ()
这样修改后的代码应该能够处理 TextIO.openIn fileName
返回的不同情况,解决了类型不匹配的问题。
英文:
I am working on a Standard ML (SML) program that reads a file given by the user and prints the first line of the file. I have written the following code:
fun readAndPrintLine instream =
case TextIO.inputLine instream of
NONE => (TextIO.closeIn instream; print "End of file.\n")
| SOME text => (TextIO.closeIn instream; print ("Read line: " ^ text ^ "\n"))
(* -->I believe the tycon mismatch is in the openAndHandleFile function here: *)
fun openAndHandleFile fileName = (*I believe the problem lies in this block of code*)
case TextIO.openIn fileName of
NONE => print ("Error: Failed to open the file " ^ fileName ^ ".\n")
| SOME instream => readAndPrintLine instream
fun read_file () = let
val _ = print "Please enter a filename to be parsed: \n"
val fileNameOpt = TextIO.inputLine TextIO.stdIn
in
case fileNameOpt of
NONE => print "No filename provided.\n"
| SOME fileName => openAndHandleFile fileName
end
(* Call the read_file function to start the program *)
val _ = read_file ();
However when I try to run the following code I get the following error:
testing4.sml:7.5-9.51 Error: case object and rules do not agree [tycon mismatch]
rule domain: TextIO.instream option
object: TextIO.instream
in expression:
(case (TextIO.openIn fileName)
of NONE => print ("Error: Failed to open the file " ^ fileName ^ ".\n")
| SOME instream => readAndPrintLine instream)
val it = () : unit
I am new to SML and I know it can be strict about data types, but I'm not sure where the issue is. I think the problem lies in the "openAndHandleFile" function.
What am I doing wrong in my code, and how can I fix the tycon mismatch error?
答案1
得分: 1
问题在于TextIO.openIn
不返回一个选项类型,因此你无法匹配SOME
或NONE
构造函数。如果TextIO.openIn
失败,它会引发一个Io
异常。
你需要处理这个异常,以应对文件无法打开的情况。
handle ... => print "未提供文件名。\n"
英文:
The problem is that TextIO.openIn
does not return an option type, so you can't match on the SOME
or NONE
constructors. If TextIO.openIn
fails, it instead raises an Io
exception.
You would want to handle this exception to address the case where the file cannot be opened.
readAndPrintLine (TextIO.openIn fileName)
handle ... => print "No filename provided.\n"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论