Практическое использование неправильных списков в Erlang (возможно, все функциональные языки) - PullRequest
8 голосов
/ 23 февраля 2011

Я читал Erlang и OTP в действии , и наткнулся на вопрос по поводу неправильных списков.

Не поддавайтесь искушению использовать ячейки списка таким образом, даже если вы думаете, что у вас есть умная идея - она ​​подвержена ошибкам и смущает как людей, так и программы инструменты анализа. Тем не менее, есть одно или два допустимых использования для создания неправильные списки, но они считаются передовые методы программирования и выходит за рамки этой книги.

Вне поля для книги? Это должно быть идеально для Stackoverflow!
Так что мой вопрос, конечно, что бы некоторые действительные использования будут?

Ответы [ 4 ]

6 голосов
/ 23 февраля 2011

Одно из предложенных в документации Erlang вариантов использования - фальсификация ленивых списков :

-module(lazy).
-export([ints_from/1]).
ints_from(N) ->
    fun() ->
            [N|ints_from(N+1)]
    end.
4 голосов
/ 23 февраля 2011

Реализация словаря OTP stdlib. Модуль dict использует неправильные списки для пар ключ-значение. Обоснование: 2-кортеж использует на 1 слово больше памяти, чем неправильный список из 2 элементов. Увидеть руководство по эффективности для деталей

4 голосов
/ 23 февраля 2011

Одно допустимое использование описано в самом низу Руководства пользователя Eunit , в разделе о ленивых генераторах. Предполагается, что в этом примере кода создается очень длинный список, который будет использоваться по одному элементу за раз, поэтому вместо генерации всего списка сразу создается неправильный список, хвост которого описывает, как генерировать остальную часть списка:

lazy_test_() ->
    lazy_gen(10000).
lazy_gen(N) ->
    {generator,
     fun () ->
         if N > 0 ->
                [?_test(...)
                 | lazy_gen(N-1)];
            true ->
                []
         end
     end}.

Другими словами, это ленивый список, который сам Эрланг не дает.

0 голосов
/ 18 мая 2016

OTP standard digraph Модуль для ориентированных графов использует неправильные списки для теговых идентификаторов вершин и ребер.Например, вершина 42 будет обозначена как ['$ v' | 42], что означает пару атомов (нет, не символьный литерал!) И целое число, аналогично ребру 97 будет ['$ e' | 97].

...