0

在 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 并打印出双倍的?双重的必须不区分大小写。因此,如果我有香蕉和香蕉,则必须打印其中的 1 个。

编辑:

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

4

1 回答 1

1

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

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

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

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

但是请注意,整个方法并不理想。合并步骤不是一件自然而然的事情,毕竟可用字符的排列列表与字典列表具有完全不同的含义。排序(一个O ( n log n ) 操作)非常荒谬且无效,因为字典可能已经排序。递归遍历两个列表要好得多,每个列表都以类似合并排序的方式“并行”单独排序。

于 2013-06-24T11:58:58.660 回答