Erlang内置head、tail函数位置查询及相关使用疑问咨询
回答
你找不到名为head/1和tail/1的函数是正常的,Erlang标准库并未提供这两个命名的内置函数,对应功能的实现有两种惯用方案:
- 方案1:优先使用模式匹配(官方推荐的最优写法)
Erlang中列表解构最简洁高效的方式就是直接用模式匹配,不需要调用额外函数:
取表头:[Head|_] = List
取表尾:[_|Tail] = List
用在函数头中可以进一步简化逻辑,示例:
这种方式性能优于任何函数调用,也是Erlang社区处理列表的通用惯例。% 示例:递归求和函数,直接在函数头完成列表解构 sum([]) -> 0; sum([H|T]) -> H + sum(T). - 方案2:使用内置缩写BIF
hd/1和tl/1
如果你确实需要通过函数调用的方式获取表头表尾,可以直接用Erlang默认导入的两个内置BIF,就是你要找的功能的缩写版本:hd(List):返回列表的第一个元素,等价head/1功能tl(List):返回列表去掉第一个元素后的剩余部分,等价tail/1功能
实际调用示例:
这两个函数是erlang模块的内置函数,默认已经导入,不需要加模块前缀即可直接调用,性能和模式匹配接近。1> hd([1,2]). 1 2> tl([1,2]). [2]
不建议用lists:nth/2和lists:nthtail/2实现该功能,这两个函数需要遍历列表到指定位置,相比模式匹配和hd/1、tl/1会产生不必要的性能开销,完全没有必要。
内容的提问来源于stack exchange,提问作者Jeffrey Benjamin Brown
相关产品推荐
相关产品推荐

