Functional programming 干净语言:在文件末尾追加数字,fwritei不';行不通
我正在尝试编写一个函数来接收Functional programming 干净语言:在文件末尾追加数字,fwritei不';行不通,functional-programming,clean-language,Functional Programming,Clean Language,我正在尝试编写一个函数来接收[String],它是文件名,String是文件目录名,*f。该函数最后将向每个文件追加一个整数 以下是我到目前为止得到的信息: import StdEnv import StdFile import FileManipulation appendNumInEndOfVmFiles :: [String] String *f -> String appendNumInEndOfVmFiles [] dirname w = "finished" appendNu
[String]
,它是文件名,String
是文件目录名,*f
。该函数最后将向每个文件追加一个整数
以下是我到目前为止得到的信息:
import StdEnv
import StdFile
import FileManipulation
appendNumInEndOfVmFiles :: [String] String *f -> String
appendNumInEndOfVmFiles [] dirname w = "finished"
appendNumInEndOfVmFiles [x:xs] dirname w
# path = dirname +++ "\\\\" +++ x
# (ok,file,files) = fopen path FAppendText w
# file = fwritei 12 file
# (ok2,_) = fclose file w
= appendNumInEndOfVmFiles xs dirname w
Start w
// 1. Receive name of directory from the user.
# (io,w) = stdio w // open stdio
# io = fwrites "Enter name of directory:\n" io // ask for name
# (name,io) = freadline io // read in name
# name = name % (0, size name - 2) // remove \n from name
# (ok,w) = fclose io w // close stdio
| not ok = abort "Couldn't close stdio" // abort in case of failure
// 2. Get a list of all file names in that directory.
# (dir,w) = getDirectoryContents (RelativePath [PathDown name]) w
# fileList = getNamesOfFilesInDirectory (getEntriesList dir)
= appendNumInEndOfVmFiles (getVmFiles fileList) name w
假设getVmFiles
是在我的FileManipulation.dcl
文件中定义的,在这个问题的上下文中name
是“myDir”
,文件列表是[“hello.vm”,“Wiki.vm”]
出于某种原因,即使我在屏幕上看到“finished”(完成)消息,文件也不会被修改。无论我给fopen
赋什么类型的整数,即使它的FWriteText
或FWriteData
仍然什么都不做。。。而且,即使我对字符使用fwritec
或fwrites
,也不会发生任何事情
我错过了什么?非常感谢
出于某种原因,即使我在屏幕上看到“finished”(完成)消息,文件也不会被修改
这是由于。在appendnumendofvmfiles
中,不使用fclose
的结果,因此不计算fclose
。因此,fwritei
也不需要计算。您可以通过在ok2
上添加一个防护来修复此问题:
# (ok2,_) = fclose file w
| not ok2 = abort "fclose failed\n"
= appendNumInEndOfVmFiles xs dirname w
但是,执行此操作的典型方法是重写函数以返回一个*f
,而不是一个字符串
,这样该唯一值就不会丢失。只要使用了结果,就会对fwritei
进行评估。您可以将*f
参数设置为严格参数(即在前面添加!
)。这将确保在进入函数之前对其进行评估,以便执行所有延迟文件关闭
您的代码还有一些问题:
w
被使用了两次,这是非法的,因为它是严格类型。您应该在guard中使用(ok2,w)
,以继续使用相同的环境
# (ok2,_) = fclose file w
= appendNumInEndOfVmFiles xs dirname w
appendnumendofvmfiles
需要有一个类型上下文|FileSystem f
,以解决fopen
和fclose
的重载问题最后: 。。。即使其
FWriteText
或FWriteData
正如您所知:区别在于第一个将以ASCII表示形式写入整数,而第二个将以4或8字节的形式写入二进制(取决于系统的位宽)。谢谢。我修复了我的代码和它的工作。你能详细解释一下文件系统f的实际情况吗?还有为什么我必须在警卫中使用
(ok2,w)
?我认为\uu
已经足够好了。@ZENir对不起,你的评论在我的收件箱里丢失了|文件系统f
是一个类上下文,您可以在语言报告中阅读更多有关它的内容。简而言之,它包含必要的函数fopen
和fclose
,根据f
的不同,这些函数可以有不同的实现。防护装置将强制评估fclose
。这与编写(true | | f(x))
时在类C语言中发生的情况有些类似:f(x)
不执行,因为不需要计算|
。你熟悉惰性评估吗?