如何将现有文件与新文件haskell进行比较

时间:2016-05-07 15:33:00

标签: file haskell io

我在haskell中实现倒排索引。 我已经说过我的代码会创建我提供的文档列表中每个单词的倒排索引。然后将此索引写入名为inv.txt的文件中,该文件类似于:

(“this”,[d1,d2,d5])

( “是”,[D3,D4,D16])

( “你好”,[D1])

但是,我想添加一个额外的案例,如果我将新文档添加到我的文件夹,并调用该函数,“inv.txt”将根据新添加的文档进行更新。 所以它现在变得像

(“this”,[d1,d2,d5,new Doc])

( “是”,[D3,D4,D16])

( “你好”,[D1])

(“get”,[new Doc])

但我想不出有办法解决这个问题。在哈斯克尔这是不可能的? (没有重写整个文件,比如使用seekg或peekg函数或其他东西)?

1 个答案:

答案 0 :(得分:1)

由于您的主要用例是向索引添加文档,所以:

  1. 您的索引文件由文本行组成,每个键一行。
  2. 在读取索引时,如果是第一次看到密钥,则将键值对插入Map(或者您使用的任何反向索引)。否则,如果密钥已存在,则将该值附加/前置到Map中的现有值。
  3. 要添加新文档,只需找到文件的末尾,然后只为新文档写出对。
  4. 例如,假设您的索引文件包含以下行:

    ("this",[d1,d2,d5])
    ...
    ("this", [d6])
    

    当您遇到第一个“this”对时,您将在Map中创建该对,当您遇到第二个“this”对时,您将d6附加/前置到与该键关联的当前列表。