这是一个关于 Haskell 列表模式返回的问题。
如果我返回一个与函数输入之一匹配的基于 cons 的列表模式,该函数是否返回对原始列表头部的引用,或者是否返回一个新列表,其中新头部指向该列表的尾部原来的名单?
我的理解是,如果一个函数的输入中有 (x:xs) 模式,则 x 将引用头值,xs 将引用原始列表的尾部,因此如果我返回 xs 它将返回对尾节点的引用,无需复制尾部内容。
但是,如果我返回整个模式或部分模式会发生什么?编译器是否识别输入模式并利用原始列表中的节点返回引用,或者是否为基于 cons 的前导元素启动一个新列表并仅重用尾部?
foobar (x:xs) = xs
对
foobar (x:xs) = (x:xs)
对
foobar (x:y:zs) = (y:zs)
Haskell 语言没有定义这些。这是一个实施细节。该语言的级别足够高,无法直接观察到两种可能性之间的差异,除非使用了不同的内存量。
通常您应该期望创建一个新列表,并且仅重用尾部。但编译器通常可以优化它以重用整个东西。
如果您想确保重复使用原始引用,请使用 at 模式:
foobar l@(x:xs) = l
如果你想确保创建一个新列表......好吧,我不知道是否有一个完全可靠的方法。但我也不明白为什么你首先会想要这个。