【问题标题】:How to add new string element to a list of strings?如何将新的字符串元素添加到字符串列表中?
【发布时间】:2020-03-08 10:33:00
【问题描述】:

在我的作业中,我想编写一个函数,将字符串添加到字符串列表中,但我不知道该怎么做。

我以为会是这样的:

AddToLS :: [String] -> String -> [String]
AddToLS ls s = (ls : s)

但这段代码甚至无法编译。

它应该像这样工作:

AddToLS [] "one" =["one"]
AddToLS ["one"] "two" =["one","two"]
AddToLS ["one","two"] "there" =["one","two","there"]

【问题讨论】:

  • 您似乎想在列表末尾添加新元素 x 。在 Haskell 中,将它添加到列表的开头会更有效,这只是表达式(x:list)。这是因为 Haskell 运行时系统只维护一个指向列表开头的指针。请记住,列表可以是无限的,因此通常您不能维护指向列表末尾的指针。
  • 附加到这样的列表会产生一个迭代效率非常低的列表。考虑使用不同的数据结构(例如difference list)。

标签: string list haskell


【解决方案1】:

您想在末尾添加一个字符串类型的元素,因此,您可以将该元素连接到一个列表中并使用现有的(++) 函数:

(++) :: [a] -> [a] -> [a]

所以你必须把你的元素放在一个列表中,像这样:

AddToLS ["one", "two"] "three"

将是:

["one", "two"] ++ ["three"]

但您可以仅为字符串列表定义自己的concat,正如我所见,参数被翻转了:

AddToLS :: [String] -> String -> [String]
addToLS = flip $ (++) . (:[]) 

相当于:

AddToLS :: [String] -> String -> [String]
addToLS ss s = ss ++ [s]

【讨论】:

  • FWIW,我不会向不知道如何将元素附加到列表的初学者推荐无点版本。最后一个更短更明显,前者需要我停下来想一想。
猜你喜欢
  • 2022-01-08
  • 2023-02-15
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多