我的任务是在Haskell中创建一个单词解算器。这个想法是给你一些随机的信件。您可以在Haskell中键入这些随机字母,并返回该字母可以形成的单词列表。为了更多地了解这一点,我使用了Haskell compare all list items但是我现在停留在最后一部分:
我有一个函数,它读入一个文件并将每个单词存储在一行中:
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” 输出:你好 地狱 孔
答案 0 :(得分: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'
应该以小写字母开头吗?
答案 1 :(得分:1)
solver:: [Char] -> FilePath -> IO [String]
solver letters file = do
words <- getList file
return $ filter (flip randomTiles letters) words