[英]Is there something like dictionary in Haskell?
输入是单词列表。 如果一个单词的最后一个字母与另一个单词的第一个字母相同,则我们将它们连接起来,并输出包含所有可能连接的列表列表。
我将输入转换为邻接表。 但这将从输入中丢失一些元素。
例如:
convert(["apple","elephant","eraser", "tower","rank"])
会给
[["elephant", "eraser"], ["tower"], ["rank"], ["rank"], []]
“苹果”连接到“大象”和“橡皮擦”。 但是结果就失去了“苹果”。 如何修复代码以在结果中包含元素?
convert :: [String] -> [[String]]
convert [] = []
convert [x] = [[]]
convert (x:xs) = [u | u <- xs, last x == head u] : convert (head xs : tail xs)
在您的代码中:
convert :: [String] -> [[String]]
convert [] = []
convert [x] = [[]]
convert (x:xs) = [u | u <- xs, last x == head u] : convert (head xs : tail xs)
列表理解只剩下另一个词u
。 [x,u]
留下您想要的组合。
并且由于列表理解留下了可能的组合,因此它将是一个由两个元素组成的列表。 [[x,u],...]
(:) :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]
因此(++)
更适合这种情况。
并且( head xs : tail xs )
就是xs
。 无需告诉转换者将它们分开。 模式匹配(x:xs)
将解决问题。 当它与大小写x:[]
匹配时,下一次它将convert []
,因此您只需要停止一种情况。
convert :: [String] -> [[String]]
convert [] = []
convert (x:xs) = [[x,u] | u <- xs, last x == head u] ++ convert xs
prompt> convert(["apple","elephant","eraser", "tower","rank"])
[["apple","elephant"],["apple","eraser"],["elephant","tower"],["eraser","rank"],["tower","rank"]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.