Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 干净语言:在文件末尾追加数字,fwritei不';行不通_Functional Programming_Clean Language - Fatal编程技术网

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)
    不执行,因为不需要计算
    |
    。你熟悉惰性评估吗?