Haskell字谜查询开发遇解析错误:输入‘f’时触发
解决Haskell字谜查询中的输入‘f’解析错误问题
看起来你在开发Haskell字谜功能时遇到了语法解析错误,而且代码还有几处未完成的部分,这大概率是导致错误的核心原因。先把你的代码片段整理出来,方便针对性分析:
import Data.Map (Map) import Data.List (sort) import qualified Data.Map as M type Anagrams = Map String [String] main :: IO() main = buildAnagrams "dictionary.txt" >>= loop where loop :: Anagrams -> IO () loop anagrams = forever $ do putStrLn "Anagrams of..." getLine >>= print . lookupAnagrams anagrams buildAnagrams :: FilePath -> IO Anagrams buildAnagrams = fmap (foldr f...)
几个关键问题及修复方案:
缺失必要的模块导入:
forever函数属于Control.Monad模块,你的代码里没有导入它,这会直接导致编译时的解析错误。需要在开头添加:import Control.Monad (forever)buildAnagrams函数未完成:你写了foldr f...但没有定义f的逻辑,也没完成整个函数的实现。这个函数的作用是读取字典文件的每一行,将每个单词按排序后的字符串作为键,把单词存入对应的列表中。完整实现如下:buildAnagrams :: FilePath -> IO Anagrams buildAnagrams filePath = do content <- readFile filePath let wordsList = lines content return $ foldr insertWord M.empty wordsList where insertWord word anagramMap = M.insertWith (++) (sort word) [word] anagramMap这里的
insertWord就是你之前缺失的f,它负责把单个单词插入到字谜Map中,相同排序键的单词会被追加到对应列表里。lookupAnagrams函数未定义:你的代码调用了这个函数但没有给出实现,这也是编译错误的来源。这个函数需要把用户输入的字符串排序后,在字谜Map中查找对应的列表:lookupAnagrams :: Anagrams -> String -> Maybe [String] lookupAnagrams anagrams input = M.lookup (sort input) anagrams
完整可运行的代码示例:
import Data.Map (Map) import Data.List (sort) import qualified Data.Map as M import Control.Monad (forever) type Anagrams = Map String [String] main :: IO () main = buildAnagrams "dictionary.txt" >>= loop where loop :: Anagrams -> IO () loop anagrams = forever $ do putStrLn "Anagrams of..." input <- getLine print $ lookupAnagrams anagrams input buildAnagrams :: FilePath -> IO Anagrams buildAnagrams filePath = do content <- readFile filePath let wordsList = lines content return $ foldr insertWord M.empty wordsList where insertWord word anagramMap = M.insertWith (++) (sort word) [word] anagramMap lookupAnagrams :: Anagrams -> String -> Maybe [String] lookupAnagrams anagrams input = M.lookup (sort input) anagrams
现在你可以尝试编译运行这个代码,当输入f时,如果你的dictionary.txt里包含单字母单词f,它会返回Just ["f"];如果没有,会返回Nothing,不会再出现解析错误了。
内容的提问来源于stack exchange,提问作者Ftuvida
相关产品推荐
相关产品推荐

