【问题标题】:Difference between list and list* in RacketRacket中list和list*的区别
【发布时间】:2020-04-21 23:02:32
【问题描述】:

阅读时:

https://docs.racket-lang.org/reference/pairs.html

我遇到了list*

类似于列表,但最后一个参数用作结果的尾部,而不是最终元素。仅当最后一个参数是列表时,结果才是列表。

“最后一个参数被用作结果的尾部,而不是最终元素”是什么意思?我认为列表总是以空列表结尾:'()

如果:“只有当最后一个参数是一个列表时,结果才是一个列表”,那还有什么?我认为方案中的所有内容都是一个列表。

【问题讨论】:

  • 这个问题肯定是重复的——它必须一直出现。但是搜索list* 太难了,我找不到。也许一个 Scheme 专家还记得它以前出现过?
  • 试图找到它,但只出现了这个问题。顺便说一句,它被索引的速度有多快。
  • "我认为列表总是以空列表结尾" -- 列表的尾部只是另一个列表,它以'() 结尾。如果你 cons 某个对象放在那个尾巴的前面,你仍然有一个列表,它仍然以 '() 结尾。

标签: scheme racket


【解决方案1】:

list* 认为不是list 的变体可能更有意义,而是将其视为cons 的变体。

> (cons 1 (list 2 3 4))
(list 1 2 3 4)
> (list* 1 (list 2 3 4))
(list 1 2 3 4)

在 2 个参数上,(list* fst rst) 产生与 (cons fst rst) 相同的结果。

当有更多参数时,list* 会添加所有参数,就像cons 的多参数版本一样。

> (cons 1 (cons 2 (cons 3 (list 4 5))))
(list 1 2 3 4 5)
> (list* 1 2 3 (list 4 5))
(list 1 2 3 4 5)

就像cons 不会产生正确的列表,如果你传递其他东西作为“休息”,list* 也会这样做。

> (equal? (cons 1 2) (list* 1 2))
#true
> (equal? (cons 1 (cons 2 3)) (list* 1 2 3))
#true

这些东西是 cons,但它们不是正确的列表。

list* 的最常见用法应该使用正确的列表作为最后一个参数。如果您正在寻找与list 的关系,那么

> (list* 1 2 3 4 '())
(list 1 2 3 4)

使用list*'() 作为最后一个参数将等效于list 没有它。

【讨论】:

  • list* 有哪些用例?
  • whats list* 比其他解决方案更擅长?
  • list* 不像 append 那样工作,但有一个关系。 (list* a b c ... d)(append (list a b c ...) d) 相同
  • @X10D -- 真的没有“更好”;它做它所做的事情,如果这是你需要的,你可以使用它。它有助于描述apply 如何处理其参数。
  • @AlexKnauth - 我在您的回答中没有看到的一个例子,但这可能有助于 OP 理解“最后一个参数用作结果的尾部,而不是最后一个元素": (list 1 2 3 '(4 5 6)) --> '(1 2 3 (4 5 6)),但是(list* 1 2 3 '(4 5 6)) --> '(1 2 3 4 5 6)
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
相关资源
最近更新 更多