Elixir的头尾

时间:2016-10-20 10:30:59

标签: elixir

我正在使用elixir并尝试使用head和tail方法以某种特定形式获取数据。

我有这种数据["09:89-87:45", "23:23-23:23", "65:65-23:04"]

做头和尾?我可以将这些数据转换为[["09:89-87:45"], ["23:23-23:23"], ["65:65-23:04"]]形式吗?

我现在正在做的事情并不顺利。

iex(14)> defmodule Gy do                                                
...(14)>   def get_head_tail([head|tail]) do
...(14)>    [[head], get_head_tail(tail)]       
...(14)>   end
...(14)>   def get_head_tail([]) do
...(14)>     []
...(14)>   end
...(14)> end

它返回[["09:89-87:45"], [["23:23-23:23"], [["65:65-23:04"], []]]] 任何帮助都将受到赞赏。

3 个答案:

答案 0 :(得分:3)

这样的东西?

def wrap([]), do: []
def wrap([a|bs]) do
  [[a]|wrap(bs)]
end

您使用了,而不是|,这意味着您创建了一个包含两个元素的列表,而不是将一个元素附加到列表的头部。

[1|[2|[3]]] == [1|[2,3]] == [1,2,3]

相比
[1,[2,[3]]]

第二件事是你在一般情况之后定义了get_head_tail([])的特例。您的版本仍然有效,但首先将特殊情况放在首位是一个好习惯,因为第一个匹配表达式(自顶向下)是使用的表达式。您编写的下一个函数可能没有相互排斥的子句,然后顺序就很重要。

答案 1 :(得分:1)

您还可以使用Enum.map/2来实现此结果:

iex> Enum.map(["09:89-87:45", "23:23-23:23", "65:65-23:04"], &([&1]))
[["09:89-87:45"], ["23:23-23:23"], ["65:65-23:04"]]

答案 2 :(得分:0)

Since, you go through full list and want to have exact number of elements as in original list, you can simply use list comprehension:

for x <-["09:89-87:45", "23:23-23:23", "65:65-23:04"], do: [x]