[英]Haskell include file and output?
我的任务是在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”输出:hello hell hole
我将从制作一个针对给定字典中所有单词测试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'
应该以小写字母开头吗?
solver:: [Char] -> FilePath -> IO [String]
solver letters file = do
words <- getList file
return $ filter (flip randomTiles letters) words
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.