1

次のようなものを書こうとしています。

ハスケル:

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.
4

3 に答える 3

3

多くの可能なソリューションから 1 つの (シンプルで効率的な) ソリューション:

now_nxt([H|T]) ->
  now_nxt(H, T).

now_nxt(_, []) -> [];
now_nxt(A, [B|T]) -> [{A, B} | now_nxt(B, T)].
于 2012-07-28T23:12:31.800 に答える
1

を使用する場合、リストは同じサイズでなければなりませんlists:zip。tl(XS) は明らかに XS よりも 1 つ短くなります。

 lists:zip(XS--[lists:last(XS)], tl(XS)).

最初の入力リストから最後の要素を削除することで、あなたがやろうとしていることを達成できると思います。

于 2012-07-28T17:58:11.683 に答える
0

別の解決策は次のとおりです。

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)].
于 2012-07-31T15:54:16.367 に答える