私の質問は既存のquestion(と彼はErlang自体の既知のバグだったことを驚いていました!私は本の同じcount_characters
の例を使用していますが、R19にあっても同じエラーが発生します。マップを使用しているときに不正なパターンがあります
コード:
% Frequency count of characters in a string
count_characters(Str) ->
count_characters(Str, #{}).
count_characters([H|T], #{ H => N }=X) ->
count_characters(T, X#{ H := N+1 });
count_characters([H|T], X) ->
count_characters(T, X#{ H => 1 });
count_characters([], X) -> X.
とエラー:ここ
1> c(lib_misc).
lib_misc.erl:40: illegal pattern
lib_misc.erl:41: variable 'N' is unbound
error
ライン40はcount-characters/2
の最初の句を指します。
私の質問は以下のとおりです。
- 私はバグがリンクされSO質問からである正確に理解することはできませんよ。誰かがエラーを引き起こしている変数とその理由を簡単に説明できますか?
- これはまだR19で修正されていますか?そうでない場合は、いつですか?それは非常にひどく壊れている例を提供する著者の本を見て悲しいです。
リンクされたページで受け入れられた回答はmaps:update
のようなものを使用しています。私は同じことをすることができますが、私は最初にエラーが存在する理由を知りたいです。
うーん。 。 。 ':='はマップのキーを更新し、別のマップに使用するのではありませんか?パターンマッチングよりも構造に似ています(またはそうではないかもしれませんが、確かに建設が関係しています)。 – dotslash
'#{H:= N}'に束縛されていない 'H 'については、本書の第2版は具体的に次のように書いています:"最初の節では、 の変数Hも地図の外に定義されます。 (必要に応じて)バインドされています。真剣に、このすべての混乱はかなり腐敗しています。 :( – dotslash
マップを更新すると、 '=>'と ':='の両方が可能になります( ':='はマップに既に存在するキーに対してのみ機能し、 '=>'は新しいキーを追加できます)。 –