list - Haskell:从后面访问列表

标签 list haskell append

今天我开始学习Haskell。我对函数式语言有点陌生,而且我很喜欢 Haskell。

但是,我有一个关于它的设计的问题,这让我很烦恼:从我目前的理解来看,访问列表后面的元素似乎比访问前面的元素要复杂得多(例如 xs:x,其中xs::[a]x::a 似乎不可能)。

(据我所知)可以将一个列表 append 到另一个列表( xs++[a] ),但在运行时会花费更多(它需要遍历整个列表)并且它不能用于模式匹配。

为什么 Haskell 缺少这样的操作?

最佳答案

列表数据类型

data [a] = [] | a : [a]

定义如上。您只能匹配两种模式:[]x : xs , 其中 x是头和xs是尾部。

准备一个列表
a = 1 : 2 : []
b = 0 : a
 (:) <-- b
 / \  
0  (:)  <-- a
   / \
  1  (:)
     / \
    2   []

simply adds a new cons cell and reuses the original list as the tail.

However, keep in mind that Haskell data structures are immutable. Appending to the tail of a list

a = 1 : 2 : []
b = a ++ [3]
 (:) <-- a      (:) <-- b
 / \            / \
1  (:)         1  (:)
   / \            / \
  2   []         2  (:)
                    / \
                   3   []

requires building an entirely new list, because no part of the original structure can be reused.

In fact, consider

a = 0 : a
b = 0 : [ x+1 | x <- b ]

(:) <-- a (:) <-- b
/\/\
0 (:) <-- a 0 (:) <-- [ x+1 | x <- b ]
/\/\
0 (:) <-- a 1 (:) <-- [ x+1 | x <- [ x+1 | x <- b ] ]
……

你将如何获得列表的最后一个元素,或者追加到最后?

还有其他数据结构如dequeue s 更适合基于前端和后端的访问。

关于list - Haskell:从后面访问列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769302/

相关文章:

java - 列表多态性

java - 无法将元素添加到 JavaFX 中的 ObservableList (UnsupportedOperationException)

haskell - `instance FromJSON a => FromJSON (Entity a)` 在 Haskell 中如何工作?

jquery - 带有 jquery $.ajax 的 Rails

loops - Golang 重新 slice 问题

c# - 在 List<T> 中搜索匹配的 2 列

python - Itertools 与索引的组合

haskell - 如何从 "add"的类 "Add"打印函数 "Fun with Type Functions"的结果

macos - 尝试在缺少依赖项的 Mac 上安装 gtk

python - 如何在 Pandas 中 append 数据帧而无需交错格式