Erlang`now next`列表迭代
我试图写一些类似以下的东西:Erlang`now next`列表迭代,erlang,Erlang,我试图写一些类似以下的东西: now_nxt_nth(Index, XS) -> nnn(Index, XS, []). nnn(Index, XS, YS) -> case Index > length(XS) of true -> lists:reverse(YS); false -> {Y,_} = lists:split(Index, XS), nnn(Index, tl(
now_nxt_nth(Index, XS) ->
nnn(Index, XS, []).
nnn(Index, XS, YS) ->
case Index > length(XS) of
true ->
lists:reverse(YS);
false ->
{Y,_} = lists:split(Index, XS),
nnn(Index, tl(XS), [Y|YS])
end.
哈斯克尔:
Prelude> let xs = [1..10]
Prelude> zip xs (tail xs)
[(1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9),(9,10)]
二郎:
1> XS = [1,2,3,4,5,6,7,8,9,10].
[1,2,3,4,5,6,7,8,9,10]
2> lists:zip(XS, tl(XS)).
** exception error: no function clause matching lists:zip("\n",[]) (lists.erl, line 321)
in function lists:zip/2 (lists.erl, line 321)
in call from lists:zip/2 (lists.erl, line 321)
now_nxt([X|Tail],XS) ->
[Y|_] = Tail,
now_nxt(Tail, [{X,Y}|XS]);
now_nxt(_,XS) -> XS.
156>coeffs:now_nxt(XS, []).
** exception error: no match of right hand side value []
更新:
谢谢你的例子。我最后写了以下内容:
now_nxt_nth(Index, XS) ->
nnn(Index, XS, []).
nnn(Index, XS, YS) ->
case Index > length(XS) of
true ->
lists:reverse(YS);
false ->
{Y,_} = lists:split(Index, XS),
nnn(Index, tl(XS), [Y|YS])
end.
当使用
列表时,列表的大小必须相等:zip
,tl(XS)显然比XS短一个
lists:zip(XS--[lists:last(XS)], tl(XS)).
我认为这是通过从第一个输入列表中删除最后一个元素来实现的。当使用
列表时,列表的大小必须相等:zip
,tl(XS)显然比XS短一个
lists:zip(XS--[lists:last(XS)], tl(XS)).
我认为,通过从第一个输入列表中删除最后一个元素,可以实现您的目标。从许多可能的解决方案中选择一个(简单而高效的)解决方案:
now_nxt([H|T]) ->
now_nxt(H, T).
now_nxt(_, []) -> [];
now_nxt(A, [B|T]) -> [{A, B} | now_nxt(B, T)].
多种可能的解决方案中的一种(简单且高效):
now_nxt([H|T]) ->
now_nxt(H, T).
now_nxt(_, []) -> [];
now_nxt(A, [B|T]) -> [{A, B} | now_nxt(B, T)].
另一个解决办法是:
lists:zip(lists:sublist(XS,length(XS)-1), tl(XS)).
应当指出的是
L--[lists:last(L)]
不能删除最后一个元素。比如说,
L = [1,2,3,4,1].
L -- [lists:last(L)] =/= [1,2,3,4]. % => true
[2,3,4,1] = L -- [lists:last(L)].
另一个解决办法是:
lists:zip(lists:sublist(XS,length(XS)-1), tl(XS)).
应当指出的是
L--[lists:last(L)]
不能删除最后一个元素。比如说,
L = [1,2,3,4,1].
L -- [lists:last(L)] =/= [1,2,3,4]. % => true
[2,3,4,1] = L -- [lists:last(L)].
因此,为了能够在上使用此函数,必须首先测试
xs%2
?我不确定您所说的xs%2
是什么意思,如果您的意思是列表长度>=2,那么您必须或让它失败并捕获异常。因此,为了能够在必须首先测试xs%2
?我不确定您的意思是什么xs%2
,如果您的意思是列表长度>=2,那么您必须或让它失败并捕获异常。