Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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 使用外部库时如何适应IO类型_Haskell_Hakyll - Fatal编程技术网

Haskell 使用外部库时如何适应IO类型

Haskell 使用外部库时如何适应IO类型,haskell,hakyll,Haskell,Hakyll,我正在试用Hakyll,但在将IO类型融入Hakyll编译过程时遇到了问题。下面是教程中的Hakyll代码示例 main :: IO () main = hakyll $ do match "posts/*" $ do route $ setExtension "html" compile $ do let url = -- $1 ctx = stringField "title" url `mapp

我正在试用Hakyll,但在将IO类型融入Hakyll编译过程时遇到了问题。下面是教程中的Hakyll代码示例

main :: IO ()
main = hakyll $ do
    match "posts/*" $ do
        route $ setExtension "html"
        compile $ do
            let url = -- $1
                ctx = stringField "title" url `mappend` defaultCtx
                in
                pandocCompiler
                >>= loadAndApplyTemplate "templates/default.html" ctx
                >>= relativizeUrls
我想查看匹配目录中的本地化文件列表(en.md,fr.md,…),并生成可用语言列表,我将使用这些语言生成重定向到翻译的URL。我认为这个逻辑必须放在
$1
左右

它是文件操作,因此它生成
IO[FilePath]
。但是
$1
Hakyll.Compiler
monad中,它是在
Hakyll.Rules
IO
monad中计算的。不知何故,我需要处理
IO
type才能在库作者设置的类型签名中工作。做这件事的好方法是什么


我还可以想到一些其他的实现,它们可以避免访问文件系统和生成
IO
type,但如果可能的话,我希望这样做。另外,我想深入了解这一点,因为这似乎是我在写Haskell时经常遇到的一种问题

可能没有必要使用
IO
,这通常应该避免,因为它会阻止Hakyll跟踪依赖项

有一个函数可以获取与模式匹配的所有项(在您的例子中,可能是
“posts/currentpost/*.md”
,这可能需要使用
getResourceFilePath
来构造)。然后给定所有这些
,您可以查看它们的
项标识符
,并提取基本名称/语言(
fr
en
…)

——草图
...
编译$do

currentPath可能没有必要使用
IO
,这通常应该避免,因为它会阻止Hakyll跟踪依赖项

有一个函数可以获取与模式匹配的所有项(在您的例子中,可能是
“posts/currentpost/*.md”
,这可能需要使用
getResourceFilePath
来构造)。然后给定所有这些
,您可以查看它们的
项标识符
,并提取基本名称/语言(
fr
en
…)

——草图
...
编译$do

当前路径
编译器
/
规则
是否有
MonadIO
实例?也许你可以把它们举起来莎拉这里有
Compiler.unsecfectompiler::IO a->Compiler a
但我在寻找更好的方法。
Compiler
/
规则有
MonadIO
实例吗?也许你可以把它们举起来莎拉有
Compiler.unsafeCompiler::IO a->Compiler a
,但我正在寻找更好的方法。它几乎成功了。。。但是Hakyll发现了循环依赖并拒绝编译。当初始匹配项为
posts/qour/en.md
时,
loadAll post/qour/*
最终尝试在编译同一文件的上下文中再次加载
posts/qour/en.md
,导致循环依赖。这有点令人沮丧,几乎奏效了。。。但是Hakyll发现了循环依赖并拒绝编译。当初始匹配项为
posts/qour/en.md
时,
loadAll post/qour/*
最终尝试在编译同一文件的上下文中再次加载
posts/qour/en.md
,导致循环依赖。这有点令人沮丧
-- rough sketch

...
  compile $ do
    currentPath <- getResourceFilePath
    allItems <- loadAll ... :: Compiler [Item ()]  -- () ignores the contents
    let idens = map itemIdentifier allItems
        url = ... idens
    ...