在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中使用双字的意思。
答案 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
。