在Haskell中组合2个列表并打印双元素

时间:2013-06-24 09:42:38

标签: haskell

在Haskell中,我有这个主要功能:

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

main = do
        ls1 <- fmap lines (readFile "dictionary.txt")
        let ls2 = combinations "Apple" "Citrus" "Banana"

如何组合ls1和ls2并打印出双层?双重必须不区分大小写。因此,如果我有香蕉和香蕉,它必须打印其中的一个。

修改

ls1是来自dictionary.txt的行列表

ls2是来自另一个称为组合

的函数的不同组合的列表

我想组合/合并/连接ls1和ls2。到像ls3这样的列表。 此列表将包含来自dictionary.txt的所有行以及来自ls2和组合函数的alle组合。

然后它必须打印ls3中的双元素作为输出。

编辑2:

dictionary.txt的结构(只是一个包含很多单词的随机列表。)就像:

Apple
Strawberry
Clown
.....

组合功能(请参阅我的代码中的编辑): 通过以下输入进行制作:

combinations "a" "b" "ded"

输出:

["acd","adc","cdb","dcb"]

背景: 应用程序适用于像拼字游戏这样的游戏:“pre”和“suf”是棋盘上的角色。而“字母”是玩家的字母。

示例值:

LS1

["Apple","Strawberry","Clown".....]

LS2

["Clwno","Clonw","Clown"..]

LS3

["Apple","Strawberry","Clown","Clwno","Clonw","Clown"]

在ls3中你现在看到2次“小丑”这个词。作为输出我想要:

["Clown"]

这就是我在ls3中使用双字的意思。

1 个答案:

答案 0 :(得分:1)

要坚持你在问题中提出的方式 - 好吧,这两个列表的“组合”只是附加,所以请使用ls1 ++ ls2。然后,如果订单被更改,如果您没问题,那么显而易见的是对列表进行排序,使等效元素彼此相邻。您可以使用sortBy执行此操作,您只需提供一个比较两个字符串的大小写标准化版本的函数。最简单的方法是使用Data.Function中的组合器:

import Data.List
import Data.Function
import Data.Char

compareCaseInsensitiv :: String -> String -> Ordering
compareCaseInsensitiv = compare `on` map toUpper

使用“duplicates”然后相邻,您可以使用简单的递归函数提取它们。您可以再次使用compareCaseInsensitiv,匹配EQ

然而,请注意,整个方法相当不理想。在所有可用字符的排列列表与字典列表具有完全不同的含义之后,组合步骤不是自然而然的事情。排序( O n 日志 n )操作)是非常荒谬和无效的,因为字典可能已经排序。最好通过两个列表进行递归,每个列表单独排序,“并行”,以合并排序的方式排序。