You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:51