我无法搞清楚这段代码。我想创建一个函数,它将一个字符串列表作为输入,并返回包含列表中所有字符串的最短超字符串。例如,
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
我不确定如何在这种情况下实现折叠功能,所以任何帮助都将不胜感激!谢谢!
答案 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"]