Недопустимое выражение при сопоставлении шаблонов с картами в Erlang

Я пытаюсь выполнить пример кода в интерактивной оболочке из книги Армстронга по Эрлангу. В книге говорится, что дело обстоит так:

1> Henry8 = #{ class => king, born => 1491, died => 1547 }. #{ born => 
1491, class=> king, died => 1547 }.
2> #{ born => B } = Henry8.
#{ born => 1491, class=> king, died => 1547 }.

Однако это то, что я получаю в оболочке, похоже, сопоставление с образцом не работает:

1> Henry8 = #{ class => king, born => 1491, died => 1547 }.
#{born => 1491,class => king,died => 1547}
2> #{ born => B } = Henry8.
* 1: illegal pattern

person katliam1999    schedule 08.07.2017    source источник


Ответы (2)


=> для построения карты. Чтобы шаблон соответствовал карте, вам нужно использовать вместо него :=.

1> Henry8 = #{ class => king, born => 1491, died => 1547 }.
#{born => 1491,class => king,died => 1547}
2> #{ born := B } = Henry8.
#{born => 1491,class => king,died => 1547}
3> B.
1491

Это описано в разделе «Карты в шаблонах» здесь.

person Dogbert    schedule 09.07.2017

Примеру кода предшествовал текст:

Шаблон, соответствующий полям карты
Синтаксис :=, который мы использовали в литерале карты, также можно использовать в качестве шаблона карты.

И этому тексту предшествовал целый раздел, объясняющий различия между => и := при построении карты, поэтому вы должны были знать о двух разных синтаксисах.

В книге строка 2 примера говорит:

2> #{born := B} = Henry8.

но в оболочке вы набрали:

2> #{ born => B } = Henry8.

Я предлагаю вам перечитать section 5.3 немного внимательнее, а также прочитать соответствующий раздел LYSE, который включает следующий пример:

1> Pets = #{"dog" => "winston", "fish" => "mrs.blub"}.
#{"dog" => "winston","fish" => "mrs.blub"}

2> #{"fish" := CatName, "dog" := DogName} = Pets.
#{"dog" => "winston","fish" => "mrs.blub"}

7> CatName.
"mrs.blub"

8> DogName.
"winston"

Здесь можно захватить содержимое любого количества элементов за раз, независимо от порядка ключей. Вы заметите, что элементы устанавливаются с помощью => и сопоставляются с :=. Оператор := также можно использовать для обновления существующего ключа на карте.

person 7stud    schedule 10.07.2017