閱讀Haskell.Happy文件,達成的「讓」操作哈斯克爾'讓我們實現
Exp : let var '=' Exp in Exp { \p -> $6 (($2,$4 p):p) }
文檔說這是「一個函數,變量值的環境中,並返回的計算值實施表達式:「
無法理解語法的實際含義,這些結構在Haskell中如何調用?
編輯:我的意思是這些
\p -> $6 (($2,$4 p):p)
閱讀Haskell.Happy文件,達成的「讓」操作哈斯克爾'讓我們實現
Exp : let var '=' Exp in Exp { \p -> $6 (($2,$4 p):p) }
文檔說這是「一個函數,變量值的環境中,並返回的計算值實施表達式:「
無法理解語法的實際含義,這些結構在Haskell中如何調用?
編輯:我的意思是這些
\p -> $6 (($2,$4 p):p)
在ML狀語言(如Haskell中)甲let
表達只是引入了一個局部變量綁定:
magnitude x y =
let xs = x * x in
let ys = y * y in
sqrt (xs + ys)
快樂文檔正在談論實施一個假想的ML類語言的解析器。在快樂語法$n
變量指的是,在目前的規則相匹配的東西指數:
let var '=' Exp in Exp
1 2 3 4 5 6
在大括號中的表達式是規則匹配時生成的代碼。
所以\p -> $6 (($2,$4 p):p)
爲您提供了一個lambda,它採用可變環境p
,它是一對名稱和值的列表。 lambda體包含在p
中分析的第二個表達式($6
),以及名稱($2
)與評估當前環境($4 p
)中解析的第一個表達式($4
)的結果之間的關聯。
其中$ 4 p,($ 2,$ 4 p)和():p的語法來自哪裏? – Herokiller
快樂有它自己特殊的非Haskell語法 –
它們指代模式中的第2,4和6個值。例如'Exp:let var'='Exp in Exp'''''是'$ 1','='是'$ 2等。這意味着$ 6(($ 2,$ 4 p):p)'評估爲'{ 2nd exp}(({var},{1st exp} p):p)'。注意正常的Haskell函數將第一個表達式應用於變量'p'和列表cons語法':'。 –
基本上,環境p
如[("x",4),("y",5)]
定義變量x
和y
的值。當您評估可能涉及此類變量的表達式時,結果取決於p
。這由\p -> ...
表示。
例如,我們可以期待類似
Exp + Exp { \p -> $1 p + $2 p }
表示,通過p
定義兩個術語都使用相同的變量值評估的事實。
現在,let
是特有的,因爲它定義了一個新的變量,給它一個值。爲了表達這個事實,我們需要改變p
用新的關聯來擴充它。
let var = Exp in Exp
$1 $2 $3 $4 $5 $6
鑑於p
,$ 4的值就是$4 p
正如我們在前面的總和例子一樣(我們假設var
是不是在$ 4個可視,也就是我們不允許var
被遞歸定義) 。寫
value_of_$4 = $4 p
然而,$ 6值不$6 p
因爲$ 6必須 「看到」 新定義var
。因此,我們寫
value_of_$6 = $6 (p augmented with the association <<var = value_of_$4>>)
是
value_of_$6 = $6 (($2,value_of_$4) : p)
是
value_of_$6 = $6 (($2, $4 p) : p)
所以我們最終
let var = Exp in Exp { \p -> $6 (($2, $4 p) : p) }
$1 $2 $3 $4 $5 $6
奇怪的是,如果你不知道哈斯克爾那麼爲什麼你學習快樂嗎? –