Haskell包含文件和输出?

时间:2013-06-23 18:49:57

标签: file function haskell output

我的任务是在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” 输出:你好          地狱          孔

2 个答案:

答案 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