Haskell 使用外部库时如何适应IO类型
我正在试用Hakyll,但在将IO类型融入Hakyll编译过程时遇到了问题。下面是教程中的Hakyll代码示例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
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
...