在删除重叠

时间:2016-10-23 22:00:38

标签: haskell

我无法搞清楚这段代码。我想创建一个函数,它将一个字符串列表作为输入,并返回包含列表中所有字符串的最短超字符串。例如,

    superstring "fire" "red" "blue" = "firedblue",

因为"重新" " fire"重叠和"红色"。

我正在使用辅助功能"重叠"协助这项职能:

    overlap :: Eq a => [a] -> [a] -> [a]
    x `overlap` y = prefix ++ y
        where (prefix, _) : _ = filter (\(_, match) -> match `isPrefixOf` y) $ zip (inits x) (tails x)

上面的辅助函数以下列方式组合字符串:

    overlap "fire" "red" = "fired"

我想使用" foldr"和我的功能"重叠"在创建我的超级字符串,但我不知道如何实现它。到目前为止,我有:

    superstring :: Eq a => [[a]] -> [a]
    superstring xs = foldr (\x acc -> x `overlap` xs) "" xs 

我不确定如何在这种情况下实现折叠功能,所以任何帮助都将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:2)

首先,让我们假设您的overlap功能符合您的预期。既然如此,有一些小问题需要处理。首先,如果您希望superstring处理所有类型的列表而不仅仅是String,那么请给它输入...

superstring :: Eq a => [[a]] -> [a]

...然后您无法在其实施中使用""

GHCi> :t ""
"" :: [Char]

只需写下[]即可。其次,用于折叠的二进制操作应该将列表的下一个元素(x)与累计值(acc)组合在一起,而不是输入列表(xs)。应用这两项更改后,superstring将变为:

superstring :: Eq a => [[a]] -> [a]
superstring xs = foldr (\x acc -> x `overlap` acc) [] xs

或者,甚至更简洁:

superstring :: Eq a => [[a]] -> [a]
superstring xs = foldr overlap [] xs

第三,请注意superstring的参数是列表。正如你在用法示例中所建议的那样,使它成为一个带有可变数量参数的函数...

superstring "fire" "red" "blue"

...需要一些相当复杂的技巧,你可能现在不想打扰,所以我建议你把它留在那里:

GHCi> superstring ["fire", "red", "blue"]
"firedblue"

最后,我上面写的所有内容都假定overlap执行它在锡上所说的内容,并且您要写的superstring可以表示为直接的折叠。最终,它取决于您和您的要求,但我并不完全确定是这种情况。例如,考虑一下如果你尝试会发生什么:

superstring ["fire", "red", "blue", "ire"]