【问题标题】:Is there something like dictionary in Haskell?Haskell中是否有类似字典的东西?
【发布时间】:2018-06-22 20:09:21
【问题描述】:

输入是单词列表。如果一个单词的最后一个字母与另一个单词的第一个字母相同,那么我们连接它们并输出一个列表列表,其中包含所有可能的连接。

我将输入转换为邻接列表。但这会从输入中丢失一些元素。

例如:

convert(["apple","elephant","eraser", "tower","rank"])

会给

[["elephant", "eraser"], ["tower"], ["rank"], ["rank"], []]

“apple”连接到“elephant”和“eraser”。但是结果中丢失了“苹果”。 如何修复我的代码以在结果中包含元素?

convert :: [String] -> [[String]]
convert [] = []
convert [x] = [[]]
convert (x:xs) = [u | u <- xs, last x == head u] : convert (head xs : tail xs)

【问题讨论】:

  • 喜欢this?
  • 是的。但是有很多案例。我不确定如何使用它。
  • : convert (head xs : tail xs): convert xs 相同
  • 我不明白你对函数应该做什么的描述。你为什么不发布你期望的结果?还有,旁注:为什么这个函数叫convert?这是一个可怕的名字,转换应该始终是本质上保留价值的东西,只是以另一种方式表示它。
  • 你的问题标题和实际问题有什么关系?您希望字典对您有什么帮助?

标签: haskell


【解决方案1】:

在您的代码中:

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"]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多