Erlang: كيفية تنفيذ الفهم Erlang القائمة؟

قم بتنفيذ فهم قائمة Erlang يأخذ عنصرين من قائمة ويقوم بعمل قائمة جديدة من القوائم.

لدي هذا الرمز

pair([], Acc) -> lists:reverse(Acc);

pair(L, Acc0) -> 
    [ A, B | T ] = L,
    Acc = [ [A, B] | Acc0 ],
    pair(T, Acc).

الذي يعمل بشكل جيد:

7> l:pair(lists:seq(1,6), []).  
[[1,2],[3,4],[5,6]]

ولكن يبدو أنني يجب أن أكون قادرًا على تنفيذ ذلك على أنه فهم قائمة. My Erlang-fu أضعف من أن نتوصل إليه.

أي اقتراحات؟

شكر

0

2 إجابة

سيكون الفهم بالقائمة مكلفًا لأنه يجب أن يفعل شيئًا ما لكل عنصر في القائمة. لإنشاء فهم قائمة ، يجب عليك بالتالي محاولة معرفة ما إذا كان عنصرًا زوجيًا أو فرديًا تتحدث إليه. إليك فكرة عما أتحدث عنه:

pair(L) ->
    L2 = lists:zip(lists:seq(1, length(L)), L),
    [[A, B] || {Ai, A} <- L2, {Bi, B} <- L2,
          Ai rem 2 == 1, Bi rem 2 == 0, Ai + 1 == Bi].

قد يكون تعقيد الوقت على هذا الأمر فظيعًا لأنني على علم بأن Erlang لا يعمل على تحسين ذلك بأي حال من الأحوال.

لا أعتقد أن هناك أي خطأ في وظيفتك ويجب عليك الالتزام بها.

0
وأضاف

لا ، فالفهم بالقائمة لن يكون طريقة جيدة لفعل ذلك ، بحكم تعريفه ، فهو يعمل فقط على عنصر واحد في كل مرة. في التعليمات البرمجية الخاصة بك هناك حقا لا حاجة لاستخدام تراكم ، الفرق في سرعة صغيرة ، هنا ، ويصبح أكثر وضوحا بدونها. أعتقد ذلك على الأقل.

pairs([A,B|L]) ->
    [[A,B]|pairs(L)];
pairs([]) -> [].
0
وأضاف
يتبع هذا تعويذة Erlang "دعها تتعطل" ، على سبيل المثال ، للحالة [a] .
وأضاف المؤلف Tilman, مصدر
Tilman نعم ، تم تحديد الوظيفة لأخذ أزواج من العناصر حتى إذا كان هناك خطأ إذا كان هناك عدد فردي من العناصر في القائمة. يمكنك بالطبع تحديد ما سيحدث في هذه الحالة والتعامل معه بعد ذلك.
وأضاف المؤلف rvirding, مصدر