2
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]

変更されない辞書ファイルからアナグラムを検索するためのマップを作成するこの関数があります。他の関数で使用する必要があるため、マップをグローバル変数として使用したいと考えています。現時点では、関数は buildAnagrams で unsafePerformIO を使用していますが、推奨されていないことを認識しています。マップを複数回構築しているため、プログラム全体も非常に遅くなります。これを行うためのより良い方法があるはずですか?

4

1 に答える 1

5

アナグラムデータを外部ファイルに保持したい場合は、それを読み取るための IO が必要です。したがって、いくつかのオプションがあります。

About unsafePerformIO: 読み取ったファイルが変更されないことが確実な場合、これは「安全な」使用例の 1 つです。実際には推奨されていないか、エレガントではありませんが、この問題を解決できます。データを複数回再読み取りしないようにするには、次を使用する必要があります

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

外部ファイルが一度だけ読み取られるようにします。

もう 1 つのオプションは、Haskell ソースに外部ファイルを含めることです。これは、いくつかの方法で行うことができます。

  • 単純なメタプログラミング: 外部ファイルを受け取り、大きな文字列ベクトルを宣言する .hs ファイルに変換するプログラムを作成します。
  • Template Haskell : メタプログラミングと同じ効果ですが、もう少しエレガントです
于 2014-12-08T11:50:53.800 に答える