繁体   English   中英

Haskell包含文件和输出?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM