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