0

我在 Haskell 中使用以下代码来获取字母组合的输出。

   combinations pre suf letters = prefixed ++ suffixed   
    where
     perms = permutation letters
     prefixed = map (\x -> pre ++ x) $ perms
     suffixed = map (\x -> x ++ suf) $ perms

我想将一个像 dictonary.txt 这样的大文本文件作为列表 ["Apple", "Banana.....]" 导入,其结构如下:

Apple
Banana
Stawberry
...... and so on

这个导入的 [String] 我想与组合的输出 [String] 合并。谁能帮我解决这个问题?

编辑: 为了更清楚。组合函数给出如下输出:

["banana","nanaba,..."]<- 几个字符的所有可能组合。

我想将此列表与一个列表与一个从 txt 文件创建的列表合并(但我不知道如何将 txt 导入字符串列表并使用它来合并)。所以输出会是这样的。

["banana","nanaba,...,Apple,Banana,Strawbery"] 

之后它将打印字符串中的双字。

Ankurs 代码的另一个编辑:

combinations pre suf letters = prefixed ++ suffixed
  where
    perms = permutation letters
    prefixed = map (\x -> pre ++ x)  $ perms
    suffixed = map (\x -> x ++ suf)  $ perms

fileLines :: FilePath -> IO [String]
fileLines file = readFile file >>= (\x -> return $ lines x)
        main = do 
         lines <- fileLines "directory.txt"
         putStr $ (combinations pre suf letters) ++ lines

我会得到一个解析器错误! :22:22:输入“=”时解析错误

有人可以帮我如何订购此代码吗?所以它不会出现任何错误?

4

2 回答 2

1
fileLines :: FilePath -> IO [String]
fileLines file = readFile file >>= (\x -> return $ lines x)


main = do
           lines <- fileLines "directory.txt"
           putStr $ show $ (combinations pre suf letters) ++ lines
于 2013-06-22T14:28:33.560 回答
1

好的,首先,让我稍微清理一下您的组合功能:

import Data.List (permutations)

-- Please add type signatures when you ask questions
combinations :: [a] -> [a] -> [a] -> [[a]]
combinations pre suf letters = prefixed ++ suffixed   
  where
    perms = permutations letters
    prefixed = map (pre ++) perms
    suffixed = map (++ suf) perms

没有必要,$您可以使用运算符分段来避免写出 lambda。

接下来,您的 main 函数需要从文件中读取行。这很简单:

main = do
    ls <- fmap lines (readFile "someFile.txt")
    ...

现在假设您将以下参数传递给您的组合函数:

combinations "foo" "bar" "banana" :: [String]

这留下了以下主程序:

main = do
    ls1 <- fmap lines (readFile "someFile.txt")
    let ls2 = combinations "foo" "bar" "banana"
    ...

现在您需要弄清楚如何将它们合并ls1ls2一个行列表,然后将它们打印出来,或者对该行列表执行您需要做的任何事情。

于 2013-06-22T16:00:39.673 回答