Сопоставление с образцом списка эликсира ~ получить x после константы с сопоставлением с образцом списка

Обрабатывает ли Elixir каким-либо образом совпадающие значения относительно констант? Примером этого может быть:

Все примеры являются псевдосинтаксисом идеи

  • (значение после) 3 = x
  • iex> [ _ | [ 3 | [ x | _ ] ] ] = [1,2,3,4,5,6,7] // x = 4
  • (значение перед 6) = x
  • iex> [ _ | [ x | [ 6 | _ ] ] ] = [1,2,3,4,5,6,7] // x = 5
  • (подсписок значений от 3 до 6) = x
  • iex> [ _ | [ 3 | [ x | [ 6 | _ ] ] ] ] = [1,2,3,4,5,6,7] // x = [4,5]
  • (подсписок из 3 значений после 4) = [a, b, c]
  • iex> [ _ | [ 3 | [ [a,b,c] | _ ] ] = [1,2,3,4,5,6,7] // x = [5,6,7]

К сожалению, большинство книг и онлайн-документации охватывают только абсолютное позиционирование от первого индекса, например N элементов из головы через [ head | tail ], но по мере того, как целевое значение удаляется от первого элемента, это становится глупо с синтаксисом типа [ _ | [ _ | [ _ | [ x | _ ] ] ] ], чтобы получить 4-й элемент в список.

Есть ли какой-либо синтаксис для сопоставления относительных индексов списка? Примером неправильного, но концептуально правдоподобного синтаксиса может быть получение последнего индекса в списке через [ _ | [ x | [] ] ] или получение значения после индекса 3 через [ _ | [ 3 | [ x | _ ] ] ]

Предоставьте пример ввода и ожидаемый результат. Очень сложно понять, чего вы пытаетесь достичь.   —  person occurr    schedule 26.01.2017

Это яснее с ожидаемыми результатами? Я полностью осознаю, что этот код недействителен, но должен продемонстрировать цель.   —  person occurr    schedule 26.01.2017

См. также:  линейный и бинарный поиск списка с использованием массивов и связанного списка
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. occurr

    Elixir / Erlang не поддерживает сопоставление с образцом элемента в неизвестной позиции в списке, поэтому ни один из 4 случаев, о которых вы упомянули, не может быть выполнен с сопоставлением с образцом.

    Единственное, что можно упростить, — это то, где вам нужен 4-й элемент списка. Вместо:

    [_ | [_ | [_ | [x | _]]]]
    

    вы можете использовать узор:

    [_, _, _, x | _]
    
    iex(1)> [_, _, _, x | _] = [1, 2, 3, 4, 5, 6]
    [1, 2, 3, 4, 5, 6]
    iex(2)> x
    4
    
  2. occurr

    Вы злоупотребляете сопоставлением с образцом, как это известно в Elixir. Если вы хотите найти значения в списке, нет шаблона.

    — (значение после) 3 = x

    iex> [_, x | _] = Enum.drop_while([1,2,3,4,5,6,7], fn e -> e != 3 end)
    #⇒ x = 4
    

    — (значение до 6) = x

    iex> [x | _] = [1,2,3,4,5,6,7]
    ...> |> Enum.take_while(fn e -> e != 6 end)
    ...> |> Enum.reverse
    #⇒ x = 5
    

    — (подсписок значений от 3 до 6) = x

    iex> [_ | x] = [1,2,3,4,5,6,7]
    ...> |> Enum.drop_while(fn e -> e != 3 end)
    ...> |> Enum.take_while(fn e -> e != 6 end)
    #⇒ x = [4, 5]
    

    — (подсписок из 3 значений после 4) = [a, b, c]

    iex> [1,2,3,4,5,6,7] 
    ...> Enum.drop_while(fn e -> e != 4 end)
    ...> Enum.slice(1..3)
    #⇒ [5,6,7]
    

    Enum.

    Я бы не назвал это злоупотреблением сопоставлением с образцом как таковым. Идея сопоставления с образцом не ограничивается исправлением образцов положения. person occurr; 27.01.2017

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: