0

我的任务是在 Haskell 中做一个单词求解器。这个想法是给你一些随机的字母。您可以在 Haskell 中键入这些随机字母,它会返回字母可以构成的单词列表。为了了解更多信息,我使用Haskell 比较所有列表项,但是我现在停留在最后一部分:
我有一个函数可以读取文件并将每个单词存储在一行中:

getList :: FilePath -> IO [String]
getList path= do contents<- readFile "wordlist.txt"
                 return(lines contents)

然后我还有另一个名为 randomTiles 的函数:

randomTiles :: [Char] -> [Char] -> Bool
randomTiles word letters = all (\c  -> LettersinWord' c word letters) word

该函数主要查看您给出的随机字母的输入,并向用户显示是否可以用它们组成一个单词,如果是,则返回 true,否则返回 false。

现在我必须创建一个函数,将 getList 加载到 randomTiles 中,以便可以将给定的随机字母与列表中的单词进行比较。如果 randomTiles 返回 true,它必须打印可以形成的单词。但是我真的不知道该怎么做,因为我是 Haskell 的新手,我什至不确定它是否可能。我已经以这种方式尝试过,但我确定这不是这样做的方法:

solver:: [Char]->[String]
solver a = test1
    where 
    randomTiles a b = getList a 
    test1= if randomTiles = true then print

为了确保,代码应该像这样工作;我给定的字母是“lohel”输出:你好地狱洞

4

2 回答 2

1

我将首先创建一个函数,针对给定字典中的所有单词测试 randomTiles:

allMatches :: [Char] -> [String] -> [String]
allMatches randomLetters words =
    filter (\word -> randomTiles word randomLetters) words

我认为“求解器”是加载字典并返回一个新函数,该函数将打印所有可以由一组随机字母组成的单词。这有几个变体,主要涉及 IO 发生的位置以及单词列表是否加载到内存中一次或每次访问时。

solver :: FilePath -> [Char] -> IO [String]
solver path randomLetters = do
    allWords <- getList path
    return $ allMatches randomLetters allWords

求解器返回匹配列表;使用“mapM_ putStrLn”打印它们很简单。由于此函数正在打印字符串,而不是返回它们,因此它是一个返回的 IO 操作()

defaultSolver :: [Char] -> IO ()
defaultSolver randomLetters =
    matches <- solver "/usr/share/dict/words" randomLetters
    mapM_ putStrLn matches

randomTiles不幸的是,您的功能仍然存在问题。是否LettersinWord'应该以小写字母开头?

于 2013-06-24T00:41:26.220 回答
1
solver:: [Char] -> FilePath -> IO [String]
solver letters file = do
    words <- getList file
    return $ filter (flip randomTiles letters) words
于 2013-06-24T05:05:23.167 回答