gpt4 book ai didi

Haskell - 想要来自不改变的文件的全局变量

转载 作者:行者123 更新时间:2023-12-03 21:33:51 26 4
gpt4 key购买 nike

type Anagrams = Map String [String]

buildAnagrams :: IO Anagrams
buildAnagrams = do
list <- readCSV "mydict.csv"
return $ foldr f Map.empty list
where
f :: String -> Anagrams -> Anagrams
f s = Map.insertWith (++) (sort s) [s]

我有这个函数,可以构建一个映射来从不会更改的字典文件中查找字谜。我希望将 map 作为全局变量,因为它需要被其他函数使用。目前,这些函数正在 buildAnagrams 上使用 unsafePerformIO,但我知道不建议这样做。整个程序也非常慢,因为它要多次构建 map 。一定有更好的方法来做到这一点吗?

最佳答案

如果你想将字谜数据保存在外部文件中,你需要IO来读取它。因此,您有几个选择:

  • 将字谜数据作为额外参数传递给所有函数
  • 使用 implicit argument 传递相同的数据
  • 将所有内容包裹在 Reader 中monad(或添加 ReaderT 变压器)
  • 使用unsafePerformIO,带有 usual caveats

关于unsafePerformIO:如果您绝对确定您读取的文件不会更改,那么这是其“安全”用例之一。虽然不推荐,也不优雅,但它可以解决这个问题。为了避免多次重新读取数据,您应该使用

{-# NOINLINE allAnagrams #-}
allAnagrams :: Anagrams
allAnagrams = unsafePermformIO buildAnagrams

这样外部文件只会被读取一次。

另一种选择是将外部文件包含在 Haskell 源代码中。这可以通过几种方式来完成,包括

  • 简单的元编程:您编写一个程序,获取外部文件并将其转换为声明大字符串向量的 .hs 文件
  • Template Haskell :与元编程效果相同,但更优雅

关于Haskell - 想要来自不改变的文件的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27357089/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com