Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Haskell 是否可能依赖于shake build中的内存值(而不是文件)?_Haskell_Shake Build System - Fatal编程技术网

Haskell 是否可能依赖于shake build中的内存值(而不是文件)?

Haskell 是否可能依赖于shake build中的内存值(而不是文件)?,haskell,shake-build-system,Haskell,Shake Build System,我正在使用shake编写一个静态站点生成器,并试图实现一种有效的方法来持久化站点导航(以及每个页面的一些元数据)。这比我想象的要复杂得多: 站点元数据是一个树数据结构,其中树中的每个节点都是永久链接,以及页面的元数据,如标题、简短简介、作者等 几乎所有页面都使用此站点元数据来呈现站点范围的导航(在标题或边栏中) 每当修改页面时,其生成规则都会修改站点元数据中自己的节点 完整的站点元数据存储在一个文件中(与每个页面元数据的单个文件相反) 如果在每个页面的构建操作结束时更新站点元数据,则会导致站

我正在使用
shake
编写一个静态站点生成器,并试图实现一种有效的方法来持久化站点导航(以及每个页面的一些元数据)。这比我想象的要复杂得多:

  • 站点元数据是一个树数据结构,其中树中的每个节点都是永久链接,以及页面的元数据,如标题、简短简介、作者等
  • 几乎所有页面都使用此站点元数据来呈现站点范围的导航(在标题或边栏中)
  • 每当修改页面时,其生成规则都会修改站点元数据中自己的节点
  • 完整的站点元数据存储在一个文件中(与每个页面元数据的单个文件相反)
如果在每个页面的构建操作结束时更新站点元数据,则会导致站点元数据被反序列化、更新、序列化并写入磁盘,可能会发生数百次(执行的每个构建规则一次)

相反,我在考虑将站点元数据读入顶部的
IORef
,并在每个页面的构建操作结束时更新内存中的IORef

然而,这可能导致两个问题:

  • 如何使
    sitemap.xml
    规则依赖于此
    IORef
    ,如何确保它在最后运行
  • 如何使每个页面依赖于此
    IORef
    ,因为这里实际上存在循环依赖关系-每个页面都依赖并更新站点元数据

如果我已经让它变得更加复杂,那么什么是一种替代的,但有效的实现方法?

首先,在优化之前,可能值得再次检查您的假设,即序列化等是昂贵的。在许多情况下,这并没有那么大的问题。但是让我们继续假设它太贵了

最大的问题是循环依赖性。如果你能设计出来,在抖动中有很多解决方案可以避免重复序列化等等。我会考虑将依赖性设计为:

  • 每个页面分别生成其元数据
  • 从所有页面收集所有元数据的单个规则,这取决于步骤1中的每个规则
  • 每个页面取决于其自身的元数据以及根据第2条收集/聚合的元数据
  • 现在你已经消除了这个循环。您还可以使规则2只聚合/序列化一次

    但仍有一个问题需要多次反序列化,这可以通过
    newCache
    消除,它可以引入对文件反序列化形式的依赖性-规则仍然依赖于文件,但通过应用的转换


    最后,如果使用上述公式,您可能希望步骤2直接生成侧边栏/顶边栏内容,然后也可以共享呈现这些功能的所有工作。

    首先,在优化之前,可能需要再次检查您的假设,即序列化等非常昂贵。在许多情况下,这并没有那么大的问题。但是让我们继续假设它太贵了

    最大的问题是循环依赖性。如果你能设计出来,在抖动中有很多解决方案可以避免重复序列化等等。我会考虑将依赖性设计为:

  • 每个页面分别生成其元数据
  • 从所有页面收集所有元数据的单个规则,这取决于步骤1中的每个规则
  • 每个页面取决于其自身的元数据以及根据第2条收集/聚合的元数据
  • 现在你已经消除了这个循环。您还可以使规则2只聚合/序列化一次

    但仍有一个问题需要多次反序列化,这可以通过
    newCache
    消除,它可以引入对文件反序列化形式的依赖性-规则仍然依赖于文件,但通过应用的转换

    最后,如果使用上述公式,您可能希望步骤2直接生成侧栏/顶栏内容,然后也可以共享渲染这些功能的所有工作