案例转换大字典词集

Roy*_*oyM 1 optimization haskell data-structures

我试图匹配字典中的单词,不区分大小写.我最初的方法是这样的:

  1. 阅读词典; 将所有单词转换为小写,存储在集合中.
  2. 检查新单词的成员资格

是否有更好(更有效)的方法来实现这一目标?我是Haskell的新手.

import System.IO
import Data.Text (toLower, pack, unpack)
import Data.Set (fromList, member)

main = do
  let path = "/usr/share/dict/american-english"
  h <- openFile path ReadMode
  hSetEncoding h utf8
  contents <- hGetContents h
  let mySet = (fromList . map (unpack . toLower . pack) . lines) contents
  putStrLn $ show $ member "acadia" mySet
Run Code Online (Sandbox Code Playgroud)

Eri*_*ikR 7

我只是Text直接使用而不是转换为/从字符串.

Data.Text.IO包含的版本hGetContents,readFile等用于读取文件中的文本,并Data.Text具有lines文本.

{-# LANGUAGE OverloadedStrings #-}
import System.IO
import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.Set as S

main = do
  let path = "/usr/share/dict/american-english"
  h <- openFile path ReadMode
  hSetEncoding h utf8
  contents <- T.hGetContents h
  let mySet = (S.fromList . map T.toLower . T.lines) contents
  putStrLn $ show $ S.member "acadia" mySet
Run Code Online (Sandbox Code Playgroud)

通过使用T.tolower和T.lines我们避免了明确的包/解压电话.

mySet现在是一组Text值而不是字符串.通过使用OverloadedStrings编译指示,文字"acadia"将被解释为Text值.