3

Haskell.Happy のドキュメントを読んで、'let' 演算子の実装にたどり着きました

 Exp : let var '=' Exp in Exp              { \p -> $6 (($2,$4 p):p) }

docs は、「変数値の環境を取り、式の計算値を返す関数」であると述べています。

構文の実際の意味を理解できません。これらの構造は Haskell でどのように呼び出されますか?

編集:私はこれらを意味します

\p -> $6 (($2,$4 p):p)
4

2 に答える 2

5

letML に似た言語 (Haskell など)の式は、ローカル変数バインディングを導入するだけです。

magnitude x y =
  let xs = x * x in
  let ys = y * y in
  sqrt (xs + ys)

Happy のドキュメントでは、架空の ML に似た言語のパーサーの実装について説明しています。Happy 構文の$n変数は、現在のルールで一致したもののインデックスを参照します。

let var '=' Exp in Exp
1   2   3   4   5  6

中括弧内の式は、そのルールが一致したときに生成されるコードです。

したがって、名前と値のペアのリストである\p -> $6 (($2,$4 p):p)変数 environment を取るラムダが得られます。pラムダの本体は、 で評価された 2 番目に解析された ( ) 式$6p、名前 ( ) と、現在の環境 ( ) で$2解析された最初の式 ( ) を評価した結果の値との関連付けで構成されます。$4$4 p

于 2014-06-19T03:08:44.627 に答える