当从 Haskell 函数返回列表模式时,引用了多少原始列表?

问题描述 投票:0回答:1

这是一个关于 Haskell 列表模式返回的问题。

如果我返回一个与函数输入之一匹配的基于 cons 的列表模式,该函数是否返回对原始列表头部的引用,或者是否返回一个新列表,其中新头部指向该列表的尾部原来的名单?

我的理解是,如果一个函数的输入中有 (x:xs) 模式,则 x 将引用头值,xs 将引用原始列表的尾部,因此如果我返回 xs 它将返回对尾节点的引用,无需复制尾部内容。

但是,如果我返回整个模式或部分模式会发生什么?编译器是否识别输入模式并利用原始列表中的节点返回引用,或者是否为基于 cons 的前导元素启动一个新列表并仅重用尾部?

foobar (x:xs) = xs

foobar (x:xs) = (x:xs)

foobar (x:y:zs) = (y:zs)
haskell functional-programming
1个回答
0
投票

Haskell 语言没有定义这些。这是一个实施细节。该语言的级别足够高,无法直接观察到两种可能性之间的差异,除非使用了不同的内存量。

通常您应该期望创建一个新列表,并且仅重用尾部。但编译器通常可以优化它以重用整个东西。

如果您想确保重复使用原始引用,请使用 at 模式:

foobar l@(x:xs) = l

如果你想确保创建一个新列表......好吧,我不知道是否有一个完全可靠的方法。但我也不明白为什么你首先会想要这个。

© www.soinside.com 2019 - 2024. All rights reserved.